Mysql

我怎樣才能簡化這個 UNION?

  • November 21, 2014

情況就是這樣 - 我有以下查詢:

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 進行排序:

  1. 首先,具有此 htk_premiere_date 鍵集的 ID 並為其分配了日期值(按日期排序)。
  2. 其次,沒有設置 htk_premiere_date 元值的 ID,但鍵在 wp_postmeta 表中有它的行。
  3. 第三 - 這基本上是整個問題的根源 - 如果文章 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 在這裡已經絕對可以了(保存一個毫無意義的重複過濾器)。

引用自:https://dba.stackexchange.com/questions/83294