SQL - 在两列上选择distinct

时间:2015-03-16 09:03:17

标签: sql postgresql sql-update duplicates distinct

我有这个表''字样'有更多信息:

+---------+------------+-----------
| 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

即,不要重复任何类别或主题。

1 个答案:

答案 0 :(得分:1)

使用GROUP BY时,您无法在选择列表中包含未订购的列。因此,在您的查询中,无法在选择列表中包含Id

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

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

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