1

你看到这个 MySQL 查询有什么问题吗?它不执行。还有其他更好的想法吗?

INSERT INTO registration 
   ( m_ID,  e_ID,   STATUS) 
SELECT 
   :m_ID, :e_ID, 1
WHERE 
    EXISTS ( SELECT 1 FROM tableb WHERE ID = :e_ID)
AND EXISTS ( SELECT 1 FROM tablec WHERE m_ID = :m_ID)

e_id传递带有和m_ID(PDO)值的数组

基本上,目标是在插入另一个表之前检查两个 ID 是否存在于不同的表中。

错误:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL    
syntax; check the manual that corresponds to your MySQL server version for the right  
syntax to use near 'WHERE EXISTS ( SELECT 1 FROM tableb WHERE ID = '276') AND EX' at 
line 4
4

3 回答 3

1

如果两个 ID 都存在于不同的表中

然而,您的查询搜索tableb了两次。除非你真的是指“在一个不同的表中”(我不这么认为,你会使用一个 single EXISTS),那么这可能是你想要的错误。

此外,PDO 应该有某种错误日志记录。查询可能不会执行,但原因应该出现 - 或者应该可以让它出现 -某处

更新

恐怕我错了,语法正确。SELECT ... WHERE除非指定表,否则MySQL 不允许。

尝试改变

SELECT 
   :m_ID, :e_ID, 1
WHERE EXISTS

SELECT * FROM
   ( SELECT :m_ID, :e_ID, 1 ) AS dummy
WHERE EXISTS

测试

mysql> SELECT 42;
+----+
| 42 |
+----+
| 42 |
+----+
1 row in set (0.00 sec)

mysql> SELECT 42 WHERE true;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE true' at line 1


mysql> SELECT * FROM ( SELECT 42 ) AS answer WHERE true;
+----+
| 42 |
+----+
| 42 |
+----+
1 row in set (0.00 sec)
于 2012-08-24T21:41:01.447 回答
0

您说您“正在查看来自不同表的 ID”,

目前您正在检查相同的表格两次:

EXISTS ( SELECT 1 FROM tableb WHERE ID = :e_ID)
AND EXISTS ( SELECT 1 FROM tableb WHERE m_ID = :m_ID)

也许您应该将对 tableb 的第二个引用更改为 tablec,如下所示:

EXISTS ( SELECT 1 FROM tableb WHERE ID = :e_ID)
AND EXISTS ( SELECT 1 FROM tablec WHERE m_ID = :m_ID)
于 2012-08-24T21:39:20.643 回答
0

也许您将列名与数组名混淆了?可以将其更改为此代码吗?

(注意 m_ID 现在只是 ID)

EXISTS ( SELECT 1 FROM tableb WHERE ID = :e_ID)
AND EXISTS ( SELECT 1 FROM tablec WHERE ID = :m_ID)

根据您的新错误编辑,这可能更有可能 或(ID 现在是 e_ID)

EXISTS ( SELECT 1 FROM tableb WHERE e_ID = :e_ID)
AND EXISTS ( SELECT 1 FROM tablec WHERE m_ID = :m_ID)
于 2012-08-24T21:50:21.910 回答