请注意以下表格
Field
+----+--------+----------+---------------------+
| id | name | Type | date |
+----+--------+----------+---------------------+
| 1 | price | int | 2009-09-02 00:07:07 |
| 2 | width | float | 2009-09-02 00:07:08 |
| 3 | height| float | 2009-09-02 00:07:30 |
+----+--------+--------------------------------+
Post
+----+--------+---------------------------------+
| id |title | Body |
+----+--------+---------------------------------+
| 1 | test | Bla bla bla |
| 2 | Hello | Bla bla bla |
| 3 | Its me | Bla bla bla |
+----+--------+---------------------------------+
Post_Annex
+----+--------+----------+---------------------+
| id | IdPost | IdField | Value |
+----+--------+----------+---------------------+
| 1 | 1 | 1 | 50 |
| 2 | 1 | 2 | 21 |
| 3 | 1 | 3 | 3 |
| 4 | 2 | 1 | 10 |
| 5 | 2 | 2 | 2 |
| 6 | 2 | 3 | 150 |
| 7 | 3 | 1 | 1 |
| 8 | 3 | 2 | 25 |
| 9 | 3 | 3 | 15 |
+----+--------+--------------------------------+
我希望从发布和 Post_Annex 表中选择数据,按照Post表的ID对它们进行分组,然后按价格进行排序(这取决于IdField Post_Annex表的等于1)。所以这是我的疑问:
SELECT p.title
FROM Post p
LEFT JOIN Post_Annex pa
ON p.id = pa.IdPost
GROUP BY p.id
ORDER BY case when pa.IdField = 1 then 0 else 1, pa.Value DESC
这给了我这个顺序的结果:its Me | Hello | test
这很好。但即使我按宽度(IdField = 2)或高度(IdField = 3)尝试订单,它也给了我相同的结果。
请掌握任何想法,以帮助我解决这个问题?提前谢谢。
答案 0 :(得分:3)
我只想修改join子句,指定要排序的字段:
SELECT p.title
FROM Post p
LEFT JOIN Post_Annex pa
ON p.id = pa.IdPost
AND pa.idfield=1
ORDER BY pa.Value DESC
然后你不必按p.id分组。
您的查询并不总是有效,因为您按p.id
进行分组,但是您正在选择(并按其排序)其他非聚合列,这些列的值可以是undetemined。
答案 1 :(得分:0)
在一个简单的SQL中,避免使用group by,以及何时使用:
SELECT p.title
FROM Post p, Post_Annex pa
WHERE p.id = pa.IdPost
AND pa.IdField = 1
ORDER BY pa.Value DESC
你可以做到这一点。