3

デザインリストに行を取得するmysqlクエリが1つあります。このリストには、IDで並べ替えられた「通常の」行と、「special_end」(これは日付で、現在はすべての行でNULLになっています)パラメーターで並べ替えられた「特別な」行があります。したがって、結果の「特別な」行は「通常」よりも高くする必要があります。

今すぐクエリ:

SELECT d.*, DATE_FORMAT(_created, '%d.%m.%Y') as _created_human, count(dp.id) photos_cnt, u.id user_id, u.class_name user_class_name, u.full_name user_full_name
FROM designs d
LEFT JOIN design_photo dp ON d.id=dp.design_id 
LEFT JOIN cms_user u ON d.cms_user_id=u.id
WHERE 1=1  AND d.status_id=1 AND d.published=1 AND u.cms_user_status_id=1 
GROUP BY d.id
ORDER BY d.special_end DESC, id DESC 
LIMIT 20 OFFSET 0

このクエリのORDERBYブロックをアップグレードして、条件付きのspecial_endパラメーターを持つ行を並べ替える必要があります。

  • d.special_end> = DATE(NOW())-> d.special_end DESCで並べ替える場合、
  • if d.special_end <= DATE(NOW())->IDDESCで並べ替えます。

例(id-row-special_end):

515 design4 2012-07-21
514 design3 2012-06-30
526 design5 null
513 design2 2012-05-30 (this date is <= DATE( NOW() ))
512 design1 null
511 design0 null
.
.
.

私はすでに次のようなものを書こうとしました

ORDER BY CASE d.special_end WHEN d.special_end >= DATE( NOW() ) THEN d.special_end WHEN d.special_end <= DATE( NOW() ) THEN d.id END DESC

また

ORDER BY IF(d.special_end >= DATE( NOW() ), d.special_end, d.id) DESC

しかし、結果はありません。

ご協力いただきありがとうございます。

4

2 に答える 2

3

条件による注文はひどく遅いかもしれません、私はむしろUNION同じ結果を達成するために使用したいと思います:

SELECT t.* FROM (
    (
        SELECT d.*, DATE_FORMAT(_created, '%d.%m.%Y') as _created_human, count(dp.id) photos_cnt, u.id user_id, u.class_name user_class_name, u.full_name user_full_name
        FROM designs d
        LEFT JOIN design_photo dp ON d.id=dp.design_id 
        LEFT JOIN cms_user u ON d.cms_user_id=u.id
        WHERE d.special_end >= DATE(NOW()) AND d.status_id=1 AND d.published=1 AND u.cms_user_status_id=1 
        GROUP BY d.id
        ORDER BY d.special_end DESC
    ) UNION (
        SELECT d.*, DATE_FORMAT(_created, '%d.%m.%Y') as _created_human, count(dp.id) photos_cnt, u.id user_id, u.class_name user_class_name, u.full_name user_full_name
        FROM designs d
        LEFT JOIN design_photo dp ON d.id=dp.design_id 
        LEFT JOIN cms_user u ON d.cms_user_id=u.id
        WHERE (d.special_end < DATE(NOW()) OR d.special_end IS NULL) AND d.status_id=1 AND d.published=1 AND u.cms_user_status_id=1 
        GROUP BY d.id
        ORDER BY d.id DESC
    )
) t LIMIT 20 OFFSET 0
于 2012-06-22T08:22:54.973 に答える
2

複数のGroupbyまたはsorting要件がある場合は、常にUNIONでクエリを分割してください。UNIONオペレーターでクエリを分割し、以下のように並べ替えるだけです。

Select * from Something where <condtion> order by 1 desc
UNION
Select * from Something where <condtion> order by 2 desc
于 2012-06-22T09:10:32.343 に答える