PHP MySQL从两个表中选择数据,从第三个表中选择一个字段

时间:2013-01-21 23:19:45

标签: php mysql group-by sql-order-by

请注意以下表格

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)尝试订单,它也给了我相同的结果。

请掌握任何想法,以帮助我解决这个问题?提前谢谢。

2 个答案:

答案 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

你可以做到这一点。