1

我正在做下一个查询:

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      |

应该返回其中一对:

  • 你好 | 欢迎(共有 1 个ID )
  • 二 | 其他(共有 id 2

所以,想法是:
获取一个 id,其keyt值设置为 21
然后,获取具有此选定 id 的所有行(独立于所有其他 keyt 值)

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

4

3 回答 3

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())

希望这是你所期望的。由于您的实际目标从问题中不是很清楚。

于 2013-04-27T15:57:32.847 回答
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;
于 2013-04-27T16:11:12.943 回答
0

您的表在 keyt 列中有两个 21,因此如果 id 为 1 和 2,则 where 子句中的子查询将返回 2 个值。因此,您需要做的不是使用等于运算符“=”,而是在 where 中使用 IN 运算符条款。

SELECT id, name, keyt FROM table WHERE id IN (SELECT t2.id FROM table t2 WHERE t2.keyt=21 ORDER BY RAND())
于 2013-04-27T16:12:59.797 回答