mySQL - СОЕДИНЯЕТСЯ и ЗАКАЗЫВАЕТ на одно / ноль / нулевое значение - PullRequest
0 голосов
/ 22 марта 2012

Я борюсь с этим запросом.

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 - это 0, 1 или null, сохраненные в поле типа longtext. Мне нужны строки, имеющие p1.meta_key = 1, чтобы быть сверху. Вместо этого он помещает поверх строк, в которых p1.meta_key не является null, и упорядочивает их по двум последним директивам ORDER BY.

UPDATE

Похоже, мне нужно правильно расставить приоритеты в этом запросе. Если я удаляю wp_posts.post_date DESC в конце запроса или просто ORDER BY следующим образом:

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 Ответ

1 голос
/ 22 марта 2012

try ...

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.

Теперь, в рамках вышеупомянутой сортировки, вы хотите, чтобы даты сортировались в порядке убывания, но ставьте любые даты NULL в КОНЕЦ списка, поэтому нам нужно определитьесли есть нулевое значение или нет ... Итак, второй случай работает аналогично первому.Если дата равна нулю, то укажите ее ВТОРОЙ, если она имеет дату, она получает ПЕРВЫЙ.

Наконец, фактический уровень даты.Сортировать по дате публикации по убыванию сначала по самым последним датам (которые ВСЕ фактические даты будут появляться перед любыми нулями) для соответствующей группировки p1.meta_key.

...