【问题标题】:MYSQL & PHP - Return 1 result per IN variable, even if variables are not uniqueMYSQL & PHP - 每个 IN 变量返回 1 个结果,即使变量不是唯一的
【发布时间】:2026-01-22 14:10:02
【问题描述】:

我正在查询数据库以返回 user_iduser_name 行,并在 PHP 中使用以下准备好的语句:

$stmt = $conn->prepare("SELECT user_name FROM users WHERE user_id IN (?,?,?,?,?,?,?,?,?,?)");

如果IN 语句中的每个变量都是唯一的并且在数据库中,我会收到每个变量的 1 个user_name 结果。 但是,如果我的 IN 语句中的变量不是唯一的(其中两个 user_id 是 foo),我目前没有得到每个 IN 变量的 user_name 结果。

如何修改我准备好的语句,这样即使我的 IN 语句中的所有变量都相同,我仍然会收到每个变量 1 行,如果变量不是则返回 null成立。

【问题讨论】:

  • 对不起,如果我的问题不清楚,我发现在这里很难表达我的问题,如果有什么不清楚的地方请询问,我会编辑问题
  • 如果我理解正确,您正在查询一个包含多个 users 的表,每个表都有一个唯一的 user_id,并且您正在传递 WHERE user_id IN (1, 2, 2, 3, 4, 5) 并期望 user_id=2 的用户被返回两次?
  • @JavierLarroulet 是的,这是正确的
  • 认真考虑处理应用代码中数据显示的问题
  • “我不确定你的意思,请你详细说明” 最简单的方法是创建一个类似 $array[1, 2, 2, 3, 4, 5] 的显示数组并创建一个记录数组来存储数据来自数据库..只需简单的循环并将显示数组与记录数组匹配并回显它们。

标签: php mysql sql prepared-statement


【解决方案1】:

改用left join

SELECT u.user_name
FROM (SELECT ? as user_id UNION ALL
      SELECT ? as user_id UNION ALL
      SELECT ? as user_id UNION ALL
      SELECT ? as user_id UNION ALL
      SELECT ? as user_id UNION ALL
      SELECT ? as user_id UNION ALL
      SELECT ? as user_id UNION ALL
      SELECT ? as user_id UNION ALL
      SELECT ? as user_id UNION ALL
      SELECT ? as user_id
     ) uu LEFT JOIN
     users u
     USING (user_id);

WHERE 子句仅过滤掉行。它不会使它们相乘。但是连接完全符合您的要求。

【讨论】:

  • 感谢您的回答,我是 SQL 新手,所以现在就开始思考吧
  • LEFT JOIN?这里需要INNER JOIN
  • @RaymondNijland 我认为 LEFT 是正确的。使用 INNER,如果任何 user_id 不匹配,它不会为 user_name 显示 null。它根本不会返回这些行。
  • 这正是我想要的。以及令人印象深刻的快速响应
  • @Don'tPanic 你的权利,我阅读了 topicstarter 还要求不匹配的部分。那么 qeury 确实应该是 LEFT JOIN