2017-08-20 2 views
0

Die folgende Abfrage war eine echte Herausforderung für mich für eine Wordpress-Website mit dem WordPress WP_post-Tabelle und die WP_postmeta-Tabelle und die wp_user-Tabelle zu erstellen. Es funktioniert perfekt, aber es enthält viele wiederholte Aussagen. Ich bin nicht sicher, wie man das vereinfacht (oder wenn es sein kann). Irgendwelche Tipps zum Vereinfachen und Beseitigen der Wiederholung würden geschätzt werden.Machen Sie meine MySQL-Abfrage weniger ausführlich

Die Tabellen enthalten Daten wie folgt aus:

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 

Dies ist die Abfrage

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 

Das Ergebnis es produziert ist:

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

Siehe https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to- be-a-very-simple-sql-query – Strawberry

+1

Ich habe nicht überprüft, ob deine 2 Teile ansonsten gleich sind (was man leicht zur Frage hinzufügen könnte, um zu verhindern, dass jeder nochmal danach suchen müsste), aber Wenn sich der Code nur in der Ein-Bedingung unterscheidet, können Sie beide Fälle einfach mit einem "oder" kombinieren, z 'VERBINDEN Sie wp_postmeta pm_to ON (p.id = pm_to.post_id UND p.post_parent = 0 ...) oder (p.post_parent = pm_to.post_id UND p.post_parent <> 0 ...)'. Wenn es andere Unterschiede gibt, können Sie die Bedingung dort auf ähnliche Weise hinzufügen, obwohl es zu einem bestimmten Zeitpunkt wahrscheinlich weniger lesbar wird, als wenn Sie es in Unionen aufteilen. – Solarflare

Antwort

0

Danke Solaflare. Das hat es getan. Dies ist meine Vereinfachung:

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 
Verwandte Themen