MySQL子查询错误:子查询返回超过1行

时间:2017-01-13 21:05:39

标签: mysql

我试图在“事件ID”与“用户ID”匹配时从我的“事件”表中选择所有数据。但是我得到一个错误1242子查询返回超过1行。

$query = "SELECT * FROM events WHERE id = (SELECT event_id FROM booking_dates WHERE user_id = '{$user_id}')";
$event_set = mysqli_query($connection, $query);

我知道我的子查询将返回多行,因为用户可以参加多个事件。那么如何让我的查询接受多行呢?

5 个答案:

答案 0 :(得分:1)

您可以使用in

SELECT * FROM events 
WHERE id IN (SELECT event_id FROM booking_dates WHERE user_id = '{$user_id}')

警告:在SQL中注入类似的字符串会使它们容易受到SQL注入攻击。如果没有此漏洞,请查看prepared statements bind arguments

答案 1 :(得分:1)

其他人已经展示了如何纠正您的语法。但是,如果使用JOIN而不是WHERE column IN (subquery),MySQL通常会表现得更好。

SELECT DISTINCT e.*
FROM events AS e
JOIN booking_dates AS b ON e.id = b.event_id
WHERE b.user_id = '$user_id'

答案 2 :(得分:0)

您的查询应该使用IN运算符和where。

$query = "SELECT * FROM events WHERE id IN (SELECT event_id FROM booking_dates WHERE user_id = '{$user_id}')";
$event_set = mysqli_query($connection, $query);

http://www.w3schools.com/sql/sql_in.asp

答案 3 :(得分:0)

我不是SQL专家,因此我的语法可能有些偏差。但是,我相信您正在寻找的是IN条款:

$query = "SELECT * FROM events WHERE id IN (SELECT event_id FROM booking_dates WHERE user_id = '{$user_id}')";
$event_set = mysqli_query($connection, $query);

答案 4 :(得分:0)

“那么如何让我的查询接受多行?”

使用具有正确加入booking_dates表的Select。 RIGHT JOIN的原因是,当eventid和给定用户有1个或更多有效的booking_dates记录时,您只想显示事件表中的记录。 我相信要实现多行,只显示代码最终会看起来像这样的数据:

scala> List(1,2).:::(List(3,4))
res15: List[Int] = List(3, 4, 1, 2)

scala> List(1,2) ::: List(3,4)
res16: List[Int] = List(1, 2, 3, 4)

如上所述,最佳做法是确保使用参数和绑定“清理”SQL查询。 此堆栈溢出链接提供了答案。 parameters in MySQLi