Mysql
我怎樣才能簡化這個 UNION?
情況就是這樣 - 我有以下查詢:
SELECT DISTINCT post_id FROM ( ( SELECT DISTINCT rp.post_id, pm.meta_value AS premiere_date FROM wp_related_people AS rp JOIN wp_posts AS p ON rp.post_id = p.ID JOIN wp_postmeta AS pm ON pm.post_id = p.ID WHERE rp.person_id = 494166 AND rp.role = 'director' AND pm.meta_key = 'htk_premiere_date' ) UNION ( SELECT DISTINCT rp.post_id, '' AS premiere_date FROM wp_related_people AS rp JOIN wp_posts AS p ON rp.post_id = p.ID JOIN wp_postmeta AS pm ON pm.post_id = p.ID WHERE rp.person_id = 494166 AND rp.role = 'director' ) ORDER BY (premiere_date IS NULL), premiere_date DESC ) AS element_ids
上面的查詢按預期工作,但是由於這兩個內部 SELECT 非常相似,我想知道是否有辦法將它們合併到一個查詢中?
這是背景:這與 WordPress 數據庫有關,並使用自定義表進行擴展。我需要獲取元素的 ID,按 htk_premiere_date 元鍵值排序。該鍵及其值儲存在 wp_postmeta - 具有以下列的表中:meta_id(此處不重要)、post_id、meta_key 和 meta_value。關鍵是,我需要按以下模式對所有 ID 進行排序:
- 首先,具有此 htk_premiere_date 鍵集的 ID 並為其分配了日期值(按日期排序)。
- 其次,沒有設置 htk_premiere_date 元值的 ID,但鍵在 wp_postmeta 表中有它的行。
- 第三 - 這基本上是整個問題的根源 - 如果文章 ID 在 wp_postmeta 表中沒有 htk_premiere_date 鍵的行,則應將其視為第 2 點。 - 就好像它有鍵但沒有分配值給它。
非常感謝您的幫助!
您的內部查詢應如下所示
SELECT DISTINCT rp.post_id, CASE WHEN pm.meta_key = 'htk_premiere_date' THEN pm.meta_value ELSE '' END AS premiere_date FROM wp_related_people AS rp JOIN wp_posts AS p ON rp.post_id = p.ID JOIN wp_postmeta AS pm ON pm.post_id = p.ID WHERE rp.person_id = 494166 AND rp.role = 'director'
在 ANSI SQL 中,DISTINCT 在這裡完全沒有意義。UNION 自動過濾重複項:
test=# SELECT 1 UNION SELECT 1; ?column? ---------- 1 (1 row)
UNION 和 UNION ALL 之間有一個明顯的區別:
test=# SELECT 1 UNION ALL SELECT 1; ?column? ---------- 1 1 (2 rows)
在您的情況下,第二個子選擇永遠不能與第一個子選擇具有相同的行(由於空列),因此 UNION ALL 在這裡已經絕對可以了(保存一個毫無意義的重複過濾器)。