Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]sformułowanie zapytania
kleszczoscisk
post 4.09.2009, 14:48:45
Post #1





Grupa: Zarejestrowani
Postów: 164
Pomógł: 3
Dołączył: 13.12.2007

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


Witam

Pobieram z kilku tabel produkty, producentów i opisy produktów w 2 językach. Pobieram obie wersje językowe opisów bo póki co wersji obcojęzycznych jest znikoma ilość i to co się da tłumaczę przez php z automatu.
Problem:
Jak wykluczyć w zapytaniu polską wersję opisu produktu jeśli istnieje obcojęzyczna ?
W tabeli 'produkty' każdy produkt ma unikalny ID. W tabeli 'opisy' każdy opis ma odpowiedni ID produktu i oprócz tego oznaczenie języka np. 'pl', 'en'.
Czy rozwiązaniem byłoby podzapytanie w rodzaju [SQL] pobierz, plaintext
  1. SELECT DISTINCT product_id FROM products
[SQL] pobierz, plaintext , które byłoby jednocześnie warunkiem w zapytaniu głównym: [SQL] pobierz, plaintext
  1. ... AND WHERE products.product_id IN(SELECT DISTINCT product_id FROM products) ...
[SQL] pobierz, plaintext Czy może powinienem filtrować uzyskane wyniki zapytania zamiast modyfikować zapytanie... ?
Musiałbym wtedy wywalić z tablicy (uzyskanej przez while($r = mysql_fetch_array($rekord)){}) te rekordy z opisem 'pl', które mają swój odpowiednik 'en'... Jak ?
?
Proszę o pomoc, podpowiedzi.

Ten post edytował kleszczoscisk 4.09.2009, 14:58:08
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
kleszczoscisk
post 11.09.2009, 16:23:37
Post #2





Grupa: Zarejestrowani
Postów: 164
Pomógł: 3
Dołączył: 13.12.2007

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


Zapytanie wyszło kolosalne, a błąd wyskoczył taki:
Kod
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'


Kod
$rekord = mysql_query("(SELECT
prod_translations.pid ,
prod_translations.product_name ,
prod_translations.lang AS jezyk ,
prod_translations.description ,
prod_translations.active,
prod_translations.isdefault ,

products.product_id,
products.category_id,
products.producer_id,
products.in_stock,
products.gfx,
products.file,
products.add_date,
products.edit_date,
products.price,
products.promo,
products.weight,
products.views,
products.category2,
products.category3,
products.sort,
products.products_related,
products.other_price,
products.product_code,

gfx.gfx_id ,
gfx.prod_id,
gfx.name AS nazwapliku ,
gfx.main_gfx ,
gfx.unic_name ,
gfx.gfx_sort ,

manufacturers.producent_id ,
manufacturers.name AS autor ,
manufacturers.info ,
manufacturers.info_eng ,
manufacturers.web

FROM `manufacturers`
LEFT JOIN  `products` ON manufacturers.producent_id = products.producer_id  
LEFT JOIN  `prod_translations` ON products.product_id = prod_translations.pid  
LEFT JOIN  `gfx` ON  products.product_id = gfx.prod_id  
WHERE manufacturers.isdefault LIKE '%$art%'
AND prod_translations.lang = 'en'
AND gfx.main_gfx = 1  
AND products.in_stock > 0  
ORDER BY products.add_date DESC  LIMIT ".($pagz*$ilez).", $ilez)
UNION
(SELECT
prod_translations.pid ,
prod_translations.product_name ,
prod_translations.lang AS jezyk ,
prod_translations.description ,
prod_translations.active,
prod_translations.isdefault ,

products.product_id,
products.category_id,
products.producer_id,
products.in_stock,
products.gfx,
products.file,
products.add_date,
products.edit_date,
products.price,
products.promo,
products.weight,
products.views,
products.category2,
products.category3,
products.sort,
products.products_related,
products.other_price,
products.product_code,

gfx.gfx_id ,
gfx.prod_id,
gfx.name AS nazwapliku ,
gfx.main_gfx ,
gfx.unic_name ,
gfx.gfx_sort ,

manufacturers.producent_id ,
manufacturers.name AS autor ,
manufacturers.info ,
manufacturers.info_eng ,
manufacturers.web

FROM `manufacturers`
LEFT JOIN  `products` ON manufacturers.producent_id = products.producer_id  
LEFT JOIN  `prod_translations` ON products.product_id = prod_translations.pid  
LEFT JOIN  `gfx` ON  products.product_id = gfx.prod_id  
WHERE manufacturers.isdefault LIKE '%$art%'
AND prod_translations.lang = 'pl'
AND gfx.main_gfx = 1  
AND products.in_stock > 0  
AND products.product_id NOT IN
(SELECT products.product_id FROM `manufacturers` LEFT JOIN  `products` ON manufacturers.producent_id = products.producer_id  LEFT JOIN  `prod_translations` ON products.product_id = prod_translations.pid  LEFT JOIN  `gfx` ON  products.product_id = gfx.prod_id  WHERE manufacturers.isdefault LIKE '%$art%' AND prod_translations.lang = 'en' AND gfx.main_gfx = 1  AND products.in_stock > 0   ORDER BY products.add_date DESC  LIMIT ".($pagz*$ilez).", $ilez)

ORDER BY products.add_date DESC  LIMIT ".($pagz*$ilez).", $ilez)") or die(mysql_error());


Tak myślę, że gdyby jednak zabrać się do tego przez przefiltrowanie wyników to może nadawać się będzie array_filter. Funkcja do której by się odwoływała musiałaby szukac w kluczu $w['id'] duplikatów i spośród nich usuwać elementy, które mają w kluczu $w['lang'] pl ... ? Help smile.gif
Go to the top of the page
+Quote Post

Posty w temacie


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 - 17:57