Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: SELECT i tablica dwuwymiarowa porównanie
Forum PHP.pl > Forum > Bazy danych > MySQL
duch4ever
Witam chce porównać 2 tablice przy pomocy array_diff, jedna jest ok drugą pobieram z bazy przy pomocy:

  1. $cat_in_order = Db::getInstance()->ExecuteS('
  2. SELECT p.`id_category_default`
  3. FROM `'._DB_PREFIX_.'order_detail` od, `'._DB_PREFIX_.'product` p
  4. WHERE p.`id_product` = od.`product_id`
  5. AND od.`id_order` = '.intval($id_order).'
  6. ');


I wszystko by było ok tyle że zwraca mi tablic wielowymiarową :/ i nie mogę ich porównać.
Mam 2 opcje, albo żeby zapytanie zwracało tablicę jednowymiarową, albo ją jakoś przekształcić tylko jak?
Zapytanie zwraca kategorie z jakich pochodzą przedmioty w sklepie, czyli jeśli klient zamówi przedmioty z kat id 1,2,3 to takie wyniki powinno zwrócić.
Proszę o pomoc
everth
O ile te tabele nie są na różnych typach baz to z pewnością da się zrobić porównanie w sqlu. Rzuć schematy tych tabel.
erix
Cytat
I wszystko by było ok tyle że zwraca mi tablic wielowymiarową :/ i nie mogę ich porównać.

Pętlą wyciągaj.

Szczerze, to nie wiem, w czym tkwi Twój problem...

A i na przyszłość: pisz, że to PrestaShop czy coś takiego; nie każdy musi znać ten interfejs dostępu do danych.
duch4ever
Tak to prestashop zapomniałem napisać. Porównuje 2 tabele:

product zawiera id produktu i id_category_default czyli poszukiwane id kategorii
order_detail to zamówienie, porównuje id zamówienia (obecnego jest zawsze jedno) i id produktu

problemem może jest to że mogą wystąpić 2 jednakowe wartość jeśli ktoś kupi 2 przedmioty z tej samej kategorii?
Jak zrobić żeby to zapytanie zwracało tablicę jednowymiarową z wartościami 1,3,5,6 etc
Dodam że nie jestem ekspertem dopiero się uczę smile.gif
everth
Jeśli dobrze rozumuję to chcesz dostać w wyniku id_kategorii z których klient zamówił towary (bez znaczenia ile poszczególnie w każdej kategorii). Jeśli tak to:
  1. $query = 'SELECT DISTINCT p.`id_category_default` FROM `'._DB_PREFIX_.'order_detail` as od, `'._DB_PREFIX_.'product` as p WHERE p.`id_product` = od.`product_id` AND od.`id_order` = '.intval($id_order);
duch4ever
Dokładnie o to chodziło wielkie dzięki działa idealnie. Jak to zrobiłeś. dlaczego działa twoje zapytanie?
I jeszcze ostatnie pytanko jak najprościej sprawdzić czy dwie tablice mają przynajmniej jeden element wspólny?

edit//
działa ale wciąż zwraca tablice wielowymiarową za szybko się ucieszyłem
everth
  1. SELECT COUNT(*) FROM `costam`,`jakostam` WHERE costam.pole=jakostam.pole

Jeśli są rekordy mające odpowiadające sobie po kolumnie 'pole' to da wynik >0, w przeciwnym razie 0. Do poczytania

EDIT: W jakim sensie wielowymiarową? Wiele kolumn? Raczej być nie może skoro dajemy select na jedną.
duch4ever
Nie mamy tablicy z poszczególnymi id np 1,2,4 tylko dla każdego id osobną tablice wewnątrz tablicy.
everth
Czy chodzi o taką konstrukcję
Kod
result[1] => array[0] =>wynik
result[2] => array[0] =>wynik

Jeśli tak to PDO się tak nie zachowuje. Możliwe że to wynik działania PrestaShopu i jego klasy. Najprościej jest przebudować tę tablicę
  1. $result = array();
  2. foreach($wynik_zapytania as $row) { //przy czym zakładam że wynik zapytania jest tablicą lub chociaż klasą implementującą interfejs Traversable
  3. $result[] = $row[0];
  4. }


EDIT: Pierniczę głupoty. Oczywiście że PDO normalnie się tak zachowuje.
duch4ever
No dokładnie. A jak to przebudowanie zastosować? Jak przebudować taką tablice na zwykłą?
$cat_in_order[0][id_category_default]
$cat_in_order[1][id_category_default]
takie odwołanie daje mi dostęp do wyniku
everth
Spróbuj tak:
  1. $cat_in_order->setFetchMode(PDO::FETCH_COLUMN ,0); //jeśli $cat_in_order jest obiektem dziedziczącym po klasie PDOStatement
  2. //test
  3. foreach ($cat_in_order as $row) {
  4. echo $row; //jeśli zwróci wartość to $cat_in_order jest tablicą jednowymiarową
  5. }

Lub jak powyższe zawiedzie to:
  1. $result = array();
  2. foreach($wynik_zapytania as $row) { //przy czym zakładam że wynik zapytania jest tablicą lub chociaż klasą implementującą interfejs Traversable
  3. $result[] = $row['id_category_default'];
  4. }
;
duch4ever
Zrobiłem prostą pętla sprawdzającą każdą podtablicę czy zawiera dane id które mnie interesuje.

  1. $licznik = 0;
  2.  
  3. while($licznik <= $suma_ile)
  4. {
  5. $result = $cat_in_order[$licznik][id_category_default];
  6. $licznik++;
  7. if (in_array($result, $cat))
  8. {
  9. $enable = 1;
  10. break;
  11. }
  12. }


W moim przypadku działa to rozwiązanie, po kolei sprawdza a kiedy znajdzie to czego szuka przerywa.
@everth dzięki za pomoc, i wszystkim innym smile.gif pozdrawiam
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.