查询子查询不返回所有结果

时间:2013-04-27 15:53:22

标签: mysql subquery

我正在进行下一个查询:

SELECT id, name, keyt
FROM table
WHERE id = (SELECT t2.id FROM table t2 WHERE t2.keyt=21 ORDER BY RAND() LIMIT 1)

假设表格如下:

| id |  name      |  keyt   |
+ ------------------------- +
| 1  |  Hello     |  21     |
| 3  |  Katzet    |  1      |
| 1  |  Welcome   |  1      |
| 2  |  Two       |  21     |
| 2  |  Other     |  1      |

应该返回其中一对:

  • 您好|欢迎(id 1 共同点)
  • 两个|其他(id 2 共同点)

所以,这个想法是:
获取一个ID,其keyt值设置为21 然后,获取具有所选id 的所有行(与所有其他keyt值无关)

如果按照您的建议执行操作...我会得到混合的 id 值,并且所有结果行必须具有相同的 id

3 个答案:

答案 0 :(得分:1)

此查询中的子查询

SELECT id, name, keyt FROM table WHERE id = (SELECT t2.id FROM table t2 WHERE t2.keyt=21 ORDER BY RAND() LIMIT 1)

只返回一条记录,因为它最后添加了LIMIT 1

  

此外,在您的问题中,该表仅包含1条记录   值 keyt = 21 ,因此您只能获得一条记录。

如果您想要更多记录,则应删除LIMIT。在这种情况下,您可以将查询重新命名为:

SELECT id, name, keyt FROM table WHERE id IN (SELECT t2.id FROM table t2 WHERE t2.keyt=21 ORDER BY RAND())

希望这是你的期望。因为你的实际目标不是很明确。

答案 1 :(得分:1)

SELECT x.* 
  FROM my_table x 
  JOIN 
     ( SELECT id 
         FROM my_table 
        WHERE keyt = 21 
        ORDER 
           BY RAND() LIMIT 1
     ) y 
    ON y.id = x.id;

答案 2 :(得分:0)

你的表在keyt列中有两个21,所以你的子句在where子句中返回2个值,如果id为1和2.所以你需要做的是使用等于运算符“=”而不是使用IN运算符在where子句中。

SELECT id, name, keyt FROM table WHERE id IN (SELECT t2.id FROM table t2 WHERE t2.keyt=21 ORDER BY RAND())