SQL - Select 两列不同

SQL - Select distinct on two column

我有这个 table 'words' 更多信息:

+---------+------------+-----------
| ID      |ID_CATEGORY | ID_THEME |
+---------+------------+-----------
| 1       |      1     |     1
| 2       |      1     |     1
| 3       |      1     |     1
| 4       |      1     |     2
| 5       |      1     |     2
| 6       |      1     |     2
| 7       |      2     |     3
| 8       |      2     |     3
| 9       |      2     |     3
| 10      |      2     |     4
| 11      |      2     |     4
| 12      |      3     |     5
| 13      |      3     |     5
| 14      |      3     |     6
| 15      |      3     |     6
| 16      |      3     |     6

这个查询给了我 3 个来自不同类别的随机 ID,但也不是来自不同的主题:

SELECT Id
FROM words
GROUP BY Id_Category, Id_Theme
ORDER BY RAND()
LIMIT 3

我想要的结果是:

+---------+------------+-----------
| ID      |ID_CATEGORY | ID_THEME |
+---------+------------+-----------
| 2       |      1     |     1
| 7       |      2     |     3
| 14      |      3     |     6

即不重复类别或主题。

当您使用 GROUP BY 时,您不能在 select 列表中包含未排序的列。因此,在您的查询中不可能将 Id 包含在 select 列表中。

所以你需要做一些更复杂的事情:

SELECT Id_Category, Id_Theme,
    (SELECT Id FROM Words W 
      WHERE W.Id_Category = G.Id_Category AND W.Id_Theme = G.Id_Theme
      ORDER BY RAND() LIMIT 1
    ) Id
FROM Words G
GROUP BY Id_Category, Id_Theme
ORDER BY RAND()
LIMIT 3

注意:查询按所需列分组,subselect 用于从组中所有可能的 Id 中随机取一个 Id。然后过滤主查询以取三个随机行。