编写mysql join和order by

时间:2013-12-22 12:14:17

标签: php mysql sql

我有以下三个表格

eaa

--------------
| id | title |
--------------
| 1  | ABC   |
--------------
| 2  | MNO   |
--------------
| 3  | XYZ   |

eap

-----------------------
| id | eaa_id | title |
-----------------------
| 1  |  1     | CDE   |
-----------------------
| 2  |  1     | BLA   |
-----------------------
| 3  |  2     | FOO   |
----------------------
| 4  |  3     | BAR   |
-----------------------
| 5  |  3     | FOB   |
-----------------------

第三张表etp

-----------------------------------
| id | eap_id | trip_id | dest_id |
-----------------------------------
| 1  |  1     |  143    |  104    |
-----------------------------------
| 2  |  2     |  143    |  226    |
-----------------------------------
| 3  |  3     |  143    |  226    |
-----------------------------------
| 4  |  4     |  143    |  226    |
-----------------------------------
| 5  |  5     |  143    |  228    |
-----------------------------------
| 6  |  6     |  128    |  123    |
-----------------------------------
| 7  |  7     |  442    |  154    |

我的问题

我希望将eap表中的所有数据和eaa表的所有数据与eaa_id表格中的eap相对trip_idetp表,并希望按结果集排序,以便对查询中给出的dest_id etp表进行排序,与给定dest_id匹配的行首先出现在其他行中来晚了。

例如,如果我提供trip_id为143而dest_id为226,则结果应该以{{1​​}} 2,3,4的行首先出现,然后是1和5

到目前为止我做了什么

eap_id

这个查询给了我所有行的eap.id,其中trip_id是143.现在我无法理解如何将dest_id传递给查询中的226,如上所述

2 个答案:

答案 0 :(得分:1)

只需在CASE子句中添加ORDER BY表达式即可。像这样:

...
WHERE etp.trip_id = 143 or etp.dest_id = 226
ORDER BY 
CASE WHEN etp.trip_id = 143 AND etp.dest_id = 226 THEN 0 ELSE 1 END, ID;

请在此处查看:

这会将行2,3,4放在第一行,然后是1,5:

| ID | EAA_ID | TITLE |
|----|--------|-------|
|  2 |      1 |   BLA |
|  3 |      2 |   FOO |
|  4 |      3 |   BAR |
|  1 |      1 |   CDE |
|  5 |      3 |   FOB |

答案 1 :(得分:0)

据我了解,您希望ORDER BY ABS(226-dest_id)