Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyciąganie z bazy produktów powiązanych
Pozycjonowanie i Optymalizacja > Projektowanie stron > PHP i MySQL
holee
Witam;

Problem wydaje się być błahym, jednak siedzę i się wkurzam już którą godzinę z rzędu.
Próbuję wyciągnąć z bazy powiązane produkty z innym produktem po tagach, które są przypisane do obu produktów.

i tak, jest tabela z tagami - tabela_tagi:

KOD
------------------------------
id | id_produkt | id_tag
------------------------------
12032     389     1339
3302     390     1339
12033     389     1340
3301     390     1340
3299     390     1341
3300     390     1342


jak ja to robię teraz:
wyciągam z bazy tagi przypisane do danego produktu, powiedzmy że produktu o id 390
otrzymuję tagi np. 1339, 1340, 1341, 1342:

KOD
$sql_pod = mysql_query ("
    SELECT id_tag FROM
        tabela_tagi as wt
    LEFT JOIN tabela_produkt as w ON
        wt.id_produkt = w.id
    WHERE
        wt.id_produkt = '".$produkt[id]."'
") or die(mysql_error());


kolejnym zapytaniem wyciągam id_produktów przypisanych do tagów wyłączając produkt na którym się znajduję:
otrzymuję: 389, 389:

KOD
$sql_pod2 = mysql_query ("
    SELECT w2.id as w2id, w2.nazwa as w2nazwa FROM
        tabela_produkt as w2
    LEFT JOIN tabela_tagi as wt2 ON
        wt2.id_produkt = w2.id                    
    WHERE
        wt2.id_tag = '".$podobne[id_tag]."' AND
        w2.id != '".$produkt[id]."'
    GROUP BY id_produkt
") or die(mysql_error());


i teraz za cholerę nie mogę zrobić aby wyświetlał mu się produkt tylko jeden raz, a nie dwa razy.
Próbowałem group by, distinct i nadal kiszka.

oto cały kod:

KOD
$sql_pod = mysql_query ("
    SELECT id_tagi FROM    tabela_tagi as wt
    LEFT JOIN wina as w ON
        wt.id_wina = w.id
    WHERE
        wt.id_wina = '".$wina[id]."'
") or die(mysql_error());

while($podobne = mysql_fetch_assoc ($sql_pod)) {

    $sql_pod2 = mysql_query ("
        SELECT w2.id as w2id, w2.nazwa as w2nazwa FROM
            tabela_produkt as w2
        LEFT JOIN tabela_tagi as wt2 ON
            wt2.id_produkt = w2.id                    
        WHERE
            wt2.id_tag = '".$podobne[id_tag]."' AND
            w2.id != '".$produkt[id]."'
        GROUP BY id_produkt
    ") or die(mysql_error());

    while($podobne2 = mysql_fetch_assoc ($sql_pod2)) {
                    
        echo '$podobne2[w2.nazwa]';
    }
}



Wiem, że to męczące patrzenie w czyjś kod, ale bardzo proszę o pomoc.
Niby działa, jednak wyświetlanie kilka razy jednego produktu psuje cały efekt.

Będę wdzięczny.

Pozdrawiam
Irek
Może informacje z tej strony się na coś przydadzą http://republika.onet.pl/20405,16585,1,04,kursy.html#16585
slawek22
group by w2.id ?

albo "inner join" zamiast "left [outer] join"
holee
CYTAT
group by w2.id ?

Masz rację, źle po prostu napisałem tutaj na forum.

Nadal sobie nie poradziłem z problemem więc spróbuje jeszcze raz odrobinę mniej zawile wink.gif

Wyciągam powiązane tagi z produktem. Otrzymuje przykładowe kilka id tagów:
1, 3, 5, 7, 9

Na tym etapie wszystko jasne wink.gif
Do jednego taga może być przypisanych kilka produktów, problem pojawia się gdy dwa lub więcej produkty mają więcej niż jeden wspólny tag.

Za pomocą otrzymanych id tagów, próbuje wyciągnąć z bazy id produktów. Jeśli zachodzi przypadek, że produkty mają kilka wspólnych tagów wówczas wyciągam jeden produkt kilkakrotnie.
A tego właśnie chcę uniknąć wink.gif Niby banał, ale mi się już chyba mózg zlasował wink.gif

Oto kod:

KOD
$sql_pod = mysql_query ("
                SELECT id_tagi FROM
                    wina_tagi
                WHERE
                    id_wina = '".$wina[id]."'
            ") or die(mysql_error());

            while($podobne = mysql_fetch_assoc ($sql_pod)) {
            
                $aa = mysql_query ("
                    SELECT * FROM
                        wina_tagi
                    WHERE
                        id_tagi = '".$podobne[id_tagi]."' AND
                        id_wina != '".$wina[id]."'
                    GROUP BY id_wina
                ") or die(mysql_error());
            
                while($podobne2 = mysql_fetch_assoc ($aa)) {
                    dump($podobne2);
                }
}


A oto wyrywek dumpa:

CYTAT
Array
(
[id] => 9019
[id_wina] => 966
[id_tagi] => 202
)

Array
(
[id] => 3024
[id_wina] => 967
[id_tagi] => 202
)

Array
(
[id] => 12106
[id_wina] => 968
[id_tagi] => 202
)

Array
(
[id] => 9017
[id_wina] => 966
[id_tagi] => 58
)

Array
(
[id] => 3027
[id_wina] => 967
[id_tagi] => 99
)

Array
(
[id] => 12104
[id_wina] => 968
[id_tagi] => 99
)

Array
(
[id] => 380
[id_wina] => 976
[id_tagi] => 99
)


i proszę podpowiedzcie mi dlaczego GROUP BY id_wina nie działa ?

Pozdrawiam i dziękuję za uwagę.
Daniel
slawek22
Jeśli to po czym grupujesz jest unikalne w wyniku, to znaczy, ze działa smile.gif

CYTAT
Za pomocą otrzymanych id tagów, próbuje wyciągnąć z bazy id produktów. Jeśli zachodzi przypadek, że produkty mają kilka wspólnych tagów wówczas wyciągam jeden produkt kilkakrotnie.

Pogrupuj po id produktu.

A no fakt nie zadziała bo wykonujesz drugą kwerendę kilka razy

Jeśli nie chcesz zmieniać tych 2 kwerend na 1 z inner join (wtedy group by zadziała jak trzeba) to sobie zdefiniuj tablice

$wynik = array();
potem dodawaj powiązane tak:
foreach ($sql_wynik as $wiersz)
$wynik[$wiersz['id_wina']] = $wiersz

Będziesz miał unikalne wyniki.
holee
@slawek22, wielkie dzięki za pomoc. Jakoś mi się udało łącząc dwa zapytania w jedno. Nigdy wcześniej nie stosowałem inner join stąd moje problemy. Nadal nie wiem jak się je stosuje, ale najwyraźniej szczęście mi dopisało wink.gif

Jeszcze raz wielkie dzięki.

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-2012 Invision Power Services, Inc.