WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Mysql join 2 ggr på samma tabell (wordpress) (https://www.wn.se/forum/showthread.php?t=1051053)

swan 2011-11-20 13:59

Mysql join 2 ggr på samma tabell (wordpress)
 
Jag har en vanlig wordpress-installation.

Varje sida i min blogg motsvarar en produkt. Produkten har två priser, beroende på vilken typ det är. Dessa lagrar jag som post meta till sidan. En sida kan alltså exempelvis ha "price_current1" = "12" och "price_current2" = "10". En del sidor har endast ett pris, då lagrar jag endast "price_current1". Dessutom har sida/produkt ett orginalpris, exempelvis "price_org1" = "30" och "price_org2" = "20".

Det jag vill göra är att jag vill ta fram en lista med alla sidor/produkter som har ett pris som är lägre än orginalpris, inklusive prisskillnaden.

Tidigare har jag först selekterat fram detta i två frågor, men det jag undrar är om det är möjligt att göra det i en enda fråga så att samma produkt inte kan dyka upp två gånger.

Mina två frågor (som är nästan likadana) ser i nuläget ut så här:

SELECT posts.*, ROUND(A.meta_value) AS price_current,
ROUND(B.meta_value) AS price_org, ROUND((A.meta_value / B.meta_value) * 100 - 100) AS price_diff FROM posts, postmeta A, postmeta B WHERE ID = A.post_id AND ID = B.post_id AND A.meta_key = 'price_current1' AND B.meta_key = 'price_org1' AND B.meta_value > A.meta_value AND post_status = 'publish' AND post_type = 'post' ORDER BY price_org DESC

SELECT posts.*, ROUND(A.meta_value) AS price_current,
ROUND(B.meta_value) AS price_org, ROUND((A.meta_value / B.meta_value) * 100 - 100) AS price_diff FROM posts, postmeta A, postmeta B WHERE ID = A.post_id AND ID = B.post_id AND A.meta_key = 'price_current2' AND B.meta_key = 'price_org2' AND B.meta_value > A.meta_value AND post_status = 'publish' AND post_type = 'post' ORDER BY price_org DESC

Problemet jag är är alltså att samma sida/produkt kan dyka upp i båda listorna. Min förhoppning är att det går att göra allt i en enda fråga och slippa få dubletter.

Går det att slå ihop dessa två frågor till en enda fråga? Hur?

swan 2011-11-21 19:42

Ingen? Känns som om lösningen är lätt - men det står bara stilla i hjärnan.

najk 2011-11-22 07:50

Nu såg jag inte om det var något mer som skiljer sig i frågan men detta kanske funkar för dig..

Kod:

SELECT posts.*, ROUND(A.meta_value) AS price_current, ROUND(B.meta_value) AS price_org, ROUND((A.meta_value / B.meta_value) * 100 - 100) AS price_diff FROM posts, postmeta A, postmeta B WHERE ID = A.post_id AND ID = B.post_id AND ( ( A.meta_key = 'price_current2' AND B.meta_key = 'price_org2' ) OR ( A.meta_key = 'price_current1' AND B.meta_key = 'price_org1' ) ) AND B.meta_value > A.meta_value AND post_status = 'publish' AND post_type = 'post' ORDER BY price_org DESC
Du kan ju också lägga till en SELECT DISTINCT posts.id, om koden ovan lämnar dubbla resultat.

swan 2011-11-22 08:08

najk: Som jag trodde var lösningen lätt. Men jag hade nog aldrig lyckas lista ut det utan din hjälp. Stort tack!!!!


Alla tider är GMT +2. Klockan är nu 06:28.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson