我试图在“事件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);
我知道我的子查询将返回多行,因为用户可以参加多个事件。那么如何让我的查询接受多行呢?
答案 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);
答案 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