Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skomplikowany JOIN na wielu tabelach
Forum PHP.pl > Forum > Bazy danych > MySQL
Uriziel01
Tym razem to ja potrzebuje pomocy smile.gif
Powiedzmy że mam zapytanie które wyciąga z bazy listę produktów (tabela PRODUCTS), przy okazji robiąc sporo JOIN'ów z tabel z opcjami wysyłki, tablicy użytkowników i tablicą z dostępnymi lokalizacjami. Oczywiście do tego jest spora ilość warunków w WHERE. Czy istnieje jakaś opcja aby w tym samym zapytanie wyciągnąć dane z jeszcze jednej tabeli (STORES) i zastosowanie na nich takiego samego sortowania jak na pozostałych (nazwy kolumn są różne od tych w tabeli PRODUCTS).

Tak żeby ostatecznie wyciągnąć dane z tabeli PRODUCTS oraz ze STORES i zrobić dla obu wszystkie niezbędne JOIN'y oraz użyć innych warunków w WHERE ?

Najmocniej przepraszam za (być może) pokrętne wyjaśnienie o co chodzi ale mam nadzieje że ktoś to zrozumie wink.gif

Powód dla którego nie pokazuje tego na przykładach z moich zapytań (tak wygląda zapytanie aktualnie):
  1. SELECT p.featured, p.featuredcat, p.reserve, p.bold, p.highlite, p.buynow_qty, p.buynow, p.buynow_price, p.buynow_purchases, p.currentprice, p.project_id, p.cid, p.description, p.date_starts, p.date_added, p.date_end, p.user_id, p.visible, p.views, p.project_title, p.additional_info, p.bids, p.status, p.close_date, p.project_details, p.project_type, p.bid_details, p.startprice, p.retailprice, p.filtered_auctiontype, p.filtered_budgetid, p.filter_budget, p.filter_escrow, p.filter_gateway, p.donation, p.charityid, p.donationpercentage, UNIX_TIMESTAMP(p.date_end) - UNIX_TIMESTAMP('2012-01-11 06:23:44') AS mytime, UNIX_TIMESTAMP(p.date_starts) - UNIX_TIMESTAMP('2012-01-11 06:23:44') AS starttime, p.currencyid, p.countryid AS country, p.country as auction_country, p.city, p.state, p.zipcode, p.description_videourl, p.paymethodoptions, u.rating, u.score, u.city AS user_city, u.state AS user_state, u.zip_code AS user_zipcode, s.ship_method, s.ship_handlingtime, s.ship_handlingfee, sd.ship_options_1, sd.ship_service_1, sd.ship_fee_1, sd.freeshipping_1, sd.ship_options_2, sd.ship_service_2, sd.ship_fee_2, sd.freeshipping_2, sd.ship_options_3, sd.ship_service_3, sd.ship_fee_3, sd.freeshipping_3, sd.ship_options_4, sd.ship_service_4, sd.ship_fee_4, sd.freeshipping_4, sd.ship_options_5, sd.ship_service_5, sd.ship_fee_5, sd.freeshipping_5 FROM test_projects AS p LEFT JOIN test_users u ON (p.user_id = u.user_id) LEFT JOIN test_projects_shipping s ON p.project_id = s.project_id LEFT JOIN test_projects_shipping_destinations sd ON p.project_id = sd.project_id WHERE p.user_id = u.user_id AND u.status = 'active' AND p.visible = '1' AND (UNIX_TIMESTAMP(p.date_end) > UNIX_TIMESTAMP('2012-01-11 06:23:44')) AND (p.status = 'open') AND (p.project_state = 'product') AND ((p.currentprice >= 689 OR p.buynow_price >= 689) AND (p.currentprice <= 2198 OR p.buynow_price <= 2198)) GROUP BY p.project_id ORDER BY p.featuredcat='1' DESC, p.date_end ASC LIMIT 0,10


EDIT:

Niestety UNION odpada, te dwie tabele maja inna ilośc kolumn.
redeemer
Nie wiem czy dobrze rozumiem Twój problem, ale co do UNION to może coś takiego Ci pomoże?
  1. SELECT a,b,c FROM t1 /*t1 ma 3 kolumny*/
  2. UNION
  3. SELECT x,y,NULL FROM t2 /*t2 ma 2 kolumny */
phpion
~redeemer dobrze prawi smile.gif całość spokojnie ogarniesz w ten sposób:
  1. SELECT
  2. t.*,
  3. cool_table.cool_field
  4. FROM
  5. (
  6. SELECT 1 AS type, some_field FROM products WHERE ...
  7. UNION
  8. SELECT 2 AS type, other_field FROM stores WHERE ...
  9. ) AS t
  10. JOIN
  11. cool_table ON (cool_table.FIELD = t.join_field)

Pamiętaj jedynie by przy UNION jakoś rozpoznać z jakiej tabeli pochodzi rekord (w przykładzie zastosowałem kolumnę type).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.