2017-08-20 46 views
0

以下查詢對於使用wordpress wp_post表和wp_postmeta表和wp_user表爲Wordpress網站構建真正的挑戰。它完美的工作,但它包含了很多重複的陳述。我不知道如何簡化這個(或者如果可以的話)。任何提示簡化和消除重複將不勝感激。使我的MySQL查詢更加詳細

表中包含的數據是這樣的:

wp_posts 
ID | post_author | post_parent | post_type | post_title | post_date 
2258 163   0    fep_message a 
2262 1    2258   fep_message re:a 
2264 163   2258   fep_message re:a 
1698 1    0    fep_message b 
1692 1    0    fep_message c 

wp_postmeta 
meta_id | post_id | meta_key   | meta_value 
14696  2258  _fep_participants 1 
14697  2258  _fep_participants 163 
9819  1698  _fep_participants 163 
9820  1698  _fep_participants 1 
9759  1692  _fep_participants 163 
9760  1692  _fep_participants 1 
9815  1692  _fep_delete_by_1 1499496054 
13751  1698  _fep_delete_by_163 1501044119 

wp_user 
ID | user_login 
1  myname 
163 theirname 

這是查詢

SELECT a.* 
FROM (
SELECT p.id, p.post_date, p.post_title, uf.user_login AS from_login, ut.user_login AS to_login 
FROM wp_posts AS p 
    JOIN wp_postmeta pm_to 
    ON (p.id = pm_to.post_id 
    AND pm_to.meta_key = '_fep_participants' 
    AND p.post_parent = 0 
    AND pm_to.meta_value <> p.post_author) 
    JOIN wp_postmeta pm_delete 
    ON (p.id = pm_delete.post_id) 
LEFT JOIN wp_users AS uf ON uf.ID = p.post_author 
LEFT JOIN wp_users AS ut ON ut.ID = pm_to.meta_value  
WHERE (p.post_type = 'fep_message' AND pm_delete.meta_value <> '_fep_delete_by_1' AND uf.user_login = 'myname' 
OR p.post_type = 'fep_message' AND pm_delete.meta_value <> '_fep_delete_by_1' AND ut.user_login = 'myname') 
AND p.post_date >= '2017-07-07 00:00:00' 
AND p.post_date <= '2017-08-12 23:59:59' 
ORDER BY p.post_date 
) a 

UNION 

SELECT b.* 
FROM (
SELECT p.id, p.post_date, p.post_title, uf.user_login AS from_login, ut.user_login AS to_login 
FROM wp_posts AS p 
    JOIN wp_postmeta pm_to 
    ON (p.post_parent = pm_to.post_id 
    AND p.post_parent <> 0 
    AND pm_to.meta_key = '_fep_participants' 
    AND pm_to.meta_value <> p.post_author) 
    JOIN wp_postmeta pm_delete 
    ON (p.id = pm_delete.post_id) 
LEFT JOIN wp_users AS uf ON uf.ID = p.post_author 
LEFT JOIN wp_users AS ut ON ut.ID = pm_to.meta_value  
WHERE (p.post_type = 'fep_message' AND pm_delete.meta_value <> '_fep_delete_by_1' AND uf.user_login = 'myname' 
OR p.post_type = 'fep_message' AND pm_delete.meta_value <> '_fep_delete_by_1' AND ut.user_login = 'myname') 
AND p.post_date >= '2017-07-07 00:00:00' 
AND p.post_date <= '2017-08-12 23:59:59' 
ORDER BY p.post_date 
) b 

它產生的結果是:

id  |post_date    |post_title  |from_login  |to_login  
1692 2017-07-07 11:45:03  c    myname   theirname 
1698 2017-07-08 16:28:18  b    myname   theirname 
2258 2017-08-11 23:15:10  a    theirname  myname 
2262 2017-08-12 16:48:05  re:a   myname   theirname 
+1

見https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-非常簡單sql查詢 – Strawberry

+1

我沒有檢查你的2部分是否是平等的(這是你可以很容易地添加到問題,以防止每個人都必須再次檢查它),但如果代碼僅在「開啓」條件下有所不同,則可以簡單地將兩種情況與「或」組合,例如'加入wp_postmeta pm_to ON(p.id = pm_to.post_id AND p.post_parent = 0 ...)或(p.post_parent = pm_to.post_id AND p.post_parent <> 0 ...)'。如果還有其他差異,你可以用類似的方式添加條件,儘管在某些時候,它可能會比在工會中分割它更少。 – Solarflare

回答

0

謝謝Solaflare。那樣做了。這是我的簡化:

SELECT p.id, p.post_date, p.post_title, uf.user_login AS from_login, ut.user_login AS to_login 
FROM wp_posts AS p 
    JOIN wp_postmeta pm_to 
    ON ((p.id = pm_to.post_id 
    AND p.post_parent = 0) OR (p.post_parent = pm_to.post_id 
    AND p.post_parent <> 0)) 
    AND pm_to.meta_key = '_fep_participants' 
    AND pm_to.meta_value <> p.post_author) 
    JOIN wp_postmeta pm_delete 
    ON (p.id = pm_delete.post_id) 
LEFT JOIN wp_users AS uf ON uf.ID = p.post_author 
LEFT JOIN wp_users AS ut ON ut.ID = pm_to.meta_value  
WHERE (p.post_type = 'fep_message' AND pm_delete.meta_value <> '_fep_delete_by_1' AND uf.user_login = 'myname' 
OR p.post_type = 'fep_message' AND pm_delete.meta_value <> '_fep_delete_by_1' AND ut.user_login = 'myname') 
AND p.post_date >= '2017-07-07 00:00:00' 
AND p.post_date <= '2017-08-12 23:59:59' 
ORDER BY p.post_date