Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Skomplikowany JOIN na wielu tabelach
Uriziel01
post 11.01.2012, 12:37:23
Post #1





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Uriziel01 11.01.2012, 13:17:21
Go to the top of the page
+Quote Post
redeemer
post 11.01.2012, 15:04:06
Post #2





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

Ostrzeżenie: (0%)
-----


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 */


--------------------
Go to the top of the page
+Quote Post
phpion
post 11.01.2012, 15:15:25
Post #3





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




~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).
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 11:36