【发布时间】:2020-10-18 08:02:30
【问题描述】:
我有一张桌子叫products:
╔═══════════╦══════════╦════════════╗
║ productID ║ designID ║ isFeatured ║
╠═══════════╬══════════╬════════════╣
║ 111111111 ║ AAAAA ║ 0 ║
║ 222222222 ║ AAAAA ║ 1 ║
║ 333333333 ║ AAAAA ║ 0 ║
║ 444444444 ║ BBBBB ║ 0 ║
║ 555555555 ║ BBBBB ║ 0 ║
║ 666666666 ║ CCCCC ║ 0 ║
║ 777777777 ║ DDDDD ║ 0 ║
║ 888888888 ║ DDDDD ║ 0 ║
║ 999999999 ║ DDDDD ║ 1 ║
╚═══════════╩══════════╩════════════╝
isFeatured (BOOL) 列的值可以是 1 或 0。 (每个designID 行中只有一个isFeatured 可以是1,所有其他都将是0。或者也可能所有isFeatured 都是0 每designID。)
现在我想从表格中过滤我的结果,使每个designID 只显示一行,但如果它有isFeatured = 1,则应选择此行。在其他情况下,它根本不重要。像这样:
╔═══════════╦══════════╦════════════╗
║ productID ║ designID ║ isFeatured ║
╠═══════════╬══════════╬════════════╣
║ 222222222 ║ AAAAA ║ 1 ║
║ 444444444 ║ BBBBB ║ 0 ║
║ 666666666 ║ CCCCC ║ 0 ║
║ 999999999 ║ DDDDD ║ 1 ║
╚═══════════╩══════════╩════════════╝
但无论我尝试什么,使用GROUP BY 总是得到相同的结果。
首先我通过这个语句尝试了它:
SELECT designID, productID, isFeatured
FROM products
GROUP BY designID
ORDER BY isFeatured DESC, designID ASC
我得到了某事。像这样:
╔═══════════╦══════════╦════════════╗
║ productID ║ designID ║ isFeatured ║
╠═══════════╬══════════╬════════════╣
║ 111111111 ║ AAAAA ║ 0 ║
║ 444444444 ║ BBBBB ║ 0 ║
║ 666666666 ║ CCCCC ║ 0 ║
║ 777777777 ║ DDDDD ║ 0 ║
╚═══════════╩══════════╩════════════╝
这不起作用,因为排序发生在分组之后。好的,到此我就明白了。
搜索了一段时间后,我想出了这个尝试:
SELECT designID, productID, isFeatured
FROM (
SELECT *
FROM products
ORDER BY isFeatured DESC
) sub
GROUP BY designID
ORDER BY isFeatured DESC, designID ASC
这给了我以前的确切结果。但我不明白为什么,因为它正在对另一组行进行分组(顺序不同)??
所以我的问题是:
- 为什么我的第二个语句不起作用?
- 获得预期结果的正确说法是什么?
谢谢!
【问题讨论】:
-
手册详细解释了这一切
标签: mysql database select group-by sql-order-by