Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> SELECT i tablica dwuwymiarowa porównanie
duch4ever
post
Post #1





Grupa: Zarejestrowani
Postów: 155
Pomógł: 0
Dołączył: 22.06.2010

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


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
Go to the top of the page
+Quote Post
everth
post
Post #2





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

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


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.
Go to the top of the page
+Quote Post
erix
post
Post #3





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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.
Go to the top of the page
+Quote Post
duch4ever
post
Post #4





Grupa: Zarejestrowani
Postów: 155
Pomógł: 0
Dołączył: 22.06.2010

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


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ę (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
everth
post
Post #5





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

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


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);
Go to the top of the page
+Quote Post
duch4ever
post
Post #6





Grupa: Zarejestrowani
Postów: 155
Pomógł: 0
Dołączył: 22.06.2010

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


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

Ten post edytował duch4ever 3.08.2010, 15:32:12
Go to the top of the page
+Quote Post
everth
post
Post #7





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

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


  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ą.

Ten post edytował everth 3.08.2010, 16:04:27
Go to the top of the page
+Quote Post
duch4ever
post
Post #8





Grupa: Zarejestrowani
Postów: 155
Pomógł: 0
Dołączył: 22.06.2010

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


Nie mamy tablicy z poszczególnymi id np 1,2,4 tylko dla każdego id osobną tablice wewnątrz tablicy.
Go to the top of the page
+Quote Post
everth
post
Post #9





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

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


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.

Ten post edytował everth 3.08.2010, 18:29:08
Go to the top of the page
+Quote Post
duch4ever
post
Post #10





Grupa: Zarejestrowani
Postów: 155
Pomógł: 0
Dołączył: 22.06.2010

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


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

Ten post edytował duch4ever 3.08.2010, 18:13:17
Go to the top of the page
+Quote Post
everth
post
Post #11





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

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


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. }
;
Go to the top of the page
+Quote Post
duch4ever
post
Post #12





Grupa: Zarejestrowani
Postów: 155
Pomógł: 0
Dołączył: 22.06.2010

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


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 (IMG:style_emoticons/default/smile.gif) pozdrawiam
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 26.09.2025 - 03:23