2012-03-22 29 views
0

我與這個查詢鬥爭。mySQL - 連接和ORDER BY一個/零/空值

SELECT SQL_CALC_FOUND_ROWS wp_posts.* 
FROM wp_posts 
    LEFT JOIN wp_postmeta p1 ON (wp_posts.ID = p1.post_id AND p1.meta_key = '_vip_post') 
    LEFT JOIN wp_postmeta p2 ON (wp_posts.ID = p2.post_id AND p2.meta_key = '_thumbnail_id') 
WHERE 1=1 
    AND wp_posts.post_type = 'housing' 
    AND (wp_posts.post_status = 'publish') 
GROUP BY wp_posts.ID 
ORDER BY 
    COALESCE(p1.meta_key, 0)+0 DESC, 
    p1.meta_key DESC, 
    if(p2.meta_key = '' or p2.meta_key is null, 1, 0) ASC, 
    wp_posts.post_date DESC LIMIT 0, 20 

是的,這是WordPress的帖子表。我加入了postmeta表格兩次。 p1.meta_key是存儲在longtext字段類型中的0,1null。我需要有p1.meta_key = 1的排在最前面。相反,它放在p1.meta_key不是null的行的頂部,並按最後兩條ORDER BY指令排序。

UPDATE

看起來我需要把我的工作重點就在此查詢。如果我從查詢的結尾處,刪除wp_posts.post_date DESC或者只是爲了通過這樣的:

p1.meta_key+0 = 1 DESC, 
IF (p2.meta_key = '' or p2.meta_key is null, 2, 1) 

行的回報只是我希望他們而不是按時間順序的方式。

這是我得到

+-----------------------+ +-------------+ +-----------------+ 
|  post_date  | + | _vip_post | + | _thumbnail_id | 
+-----------------------+ +-------------+ +-----------------+ 
| 2012-03-18 21:47:33 | |  0  | |  533  | 
| 2012-03-18 21:36:49 | |  0  | |  230  | 
| 2012-03-18 20:19:50 | |  0  | |  170  | 
| 2012-03-18 17:19:52 | |  1  | |  56  | 
| 2012-03-20 10:42:00 | |  null | |  null  | 
| 2012-03-19 18:56:10 | |  null | |  null  | 
| 2012-03-16 03:12:32 | |  null | |  ''  | 
| 2012-03-15 16:40:22 | |  null | |  ''  | 
+-----------------------+ +-------------+ +-----------------+ 

這是我需要它

+-----------------------+ +-------------+ +-----------------+ 
|  post_date  | + | _vip_post | + | _thumbnail_id | 
+-----------------------+ +-------------+ +-----------------+ 
| 2012-03-18 17:19:52 | |  1  | |  56  | 
| 2012-03-18 21:47:33 | |  0  | |  533  | 
| 2012-03-18 21:36:49 | |  0  | |  230  | 
| 2012-03-18 20:19:50 | |  0  | |  170  | 
| 2012-03-20 10:42:00 | |  null | |  null  | 
| 2012-03-19 18:56:10 | |  null | |  null  | 
| 2012-03-16 03:12:32 | |  null | |  ''  | 
| 2012-03-15 16:40:22 | |  null | |  ''  | 
+-----------------------+ +-------------+ +-----------------+ 

回答

1

嘗試...

order by 
    case when p1.meta_key is null then 3 
     when p1.meta_key = 1 then 1 
     when p1.meta_key is 0 then 2 end, 
    case p2.meta_key is null then 2 
     else 1 end, 
    wp_posts.post_date DESC 

通過此處的順序首先檢查上p1.meta_key。首先檢查NULL並將其設置爲3.如果不是,則如果其值爲1,則使用1作爲其第一級排序順序。如果= 0,則2作爲其排序順序。

現在,在上述類型中,您希望按降序排列日期,但在列表的結尾處放置任何空日期,所以我們需要限定是否存在空值或不是......所以第二種情況與第一個類似。如果日期爲空,則將其置於SECOND,如果日期有效,則爲FIRST。

最後是實際的日期等級。按照每個p1.meta_key分組的最新日期降序排列(所有實際日期都會出現在任何空值之前)。

+0

仍然沒有運氣。在嘗試絕望的變體時,我刪除了最後一個'ORDER BY'條件'wp_posts.post_date DESC',它按照'p1.meta_key'正好排序,但不按時間順序排序。 – Zlatev 2012-03-22 13:26:39

+0

@Zlatev,你可以發佈你的結果看起來像你的答案,並顯示你想要他們排序的實際順序的額外列...我們會讓你在那裏... – DRapp 2012-03-22 13:32:38

+0

希望現在清楚。 – Zlatev 2012-03-22 14:14:43