![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
![]() Grupa: Developerzy Postów: 823 Pomógł: 12 Dołączył: 18.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
Ajjj... dawno nie pisałem
![]() ![]() Mój problem polega na tym, że potrzebuje wybrać dane z drugiej tabeli, jednakże LEFT JOIN tu zawodzi. Posiadam tabele:
Przy zapytaniu:
chciałbym pobrać również wszystkie rekordy z tabeli tags gdzie tag_note = note_id przypisane do wybieranego rekordu. LEFT JOIN pobierze tylko jeden tag (rekord z tabeli tags), a chciałbym otrzymać wszystkie w jednym zapytaniu. Jakieś sugestie? Dzięki za odpowiedź ![]() Pozdrawiam, Athlan -------------------- Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 100 Pomógł: 1 Dołączył: 6.02.2006 Ostrzeżenie: (0%) ![]() ![]() |
Szczerze mówiąc nie wiem z czym masz problem. Zastoswanie LEFT JOIN powinno zwrócić wszystkie powiązane rekordy z tabeli 'tags' a nie tylko jeden jak piszesz. Może grupujesz wyniki zapytania? Zapytanie może wyglądać następująco:
-------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Developerzy Postów: 823 Pomógł: 12 Dołączył: 18.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
@Norbas, zanim coś napiszesz sprawdź czy to działa
![]() LEFT JOIN przypina z lewej strony (czyli dane mogą nie istnieć) TYLKO I WYŁĄCZNIE kolejne pola, nie rekordy. RIGHT JOIN przypina pola z prawej strony, czyli nasz rekord który przpinamy z drugiej tabeli MUSI istnieć. Pozdro ![]() -------------------- Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 100 Pomógł: 1 Dołączył: 6.02.2006 Ostrzeżenie: (0%) ![]() ![]() |
Dobra sprawdziłem, chociaż nigdy nie sprawdzam tak prostych zapytań
![]() Załóżmy, że mamy taką strukturę tabel jak podałeś. Dopisujemy dane:
Czyli tagi 't1' i 't2' są powiązane z pierwszą notatką, zaś 't2' z drugą. Po wykonaniu zapytania, które podałem (z ewentualnym sortowaniem) otrzymamy (pomijam nieistotne pola z obu tabel): Kod note_id | tag_name 1 | t1 1 | t2 2 | t2 czyli moim zdaniem tak jak chciałeś: Cytat chciałbym pobrać również wszystkie rekordy z tabeli tags gdzie tag_note = note_id przypisane do wybieranego rekordu. Chyba, że inaczej rozumiemy słowo rekord? -------------------- |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 215 Pomógł: 1 Dołączył: 13.04.2003 Skąd: z ławki przed blokiem Ostrzeżenie: (0%) ![]() ![]() |
orpocz left i right sa jeszcze alter, inner join, sprawdz, ja nigdy nie pameitam ktory co robi ;]
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Developerzy Postów: 823 Pomógł: 12 Dołączył: 18.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
Norbas, misiu...
Cytat chciałbym pobrać również wszystkie rekordy z tabeli tags gdzie tag_note = note_id przypisane do wybieranego rekordu.
-------------------- Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 100 Pomógł: 1 Dołączył: 6.02.2006 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Norbas, misiu... Ale czułości, żebyś chociaż był kobietą ![]() Widzę, że dalej się nie rozumiemy. Przecież otrzymasz wszystkie powiązane rekordy z tagami. Domyślam się co chcesz uzyskać (ale tego nie napisałeś): chcesz wyświetlić listę notatek z tagami przyporządkowanymi do danej notatki. Jeżeli tak, to można zastosować zapytanie, które podałem, ale jest w tym wypadku problem ze stronicowaniem, gdyż nie wiadomo ile tagów jest przyporządkowane do danej notatki. Moim zdaniem w takiej sytuacji jedno zapytanie nie wystarczy. W takim wypadku proponuję inne rozwiązanie. Wykonujesz zapytanie o notatki:
W pętli przetwarzasz wyniki zapytania wstawiając je do tablicy wyników i rezerwujesz jeden element takiej tablicy na tagi przyporządkowane do danej notatki: Kod $returns[$rows['note_id']] = array( 'note_blog' => $row['note_blog'], // itd. (pola, które są potrzebne) 'tags' => array() ); Następnie mając identyfikatory notatek wykonujesz drugie zapytanie tylko o tagi dla odczytanych identyfikatorów: Kod 'SELECT * FROM tags WHERE tag_note IN (' . impode(',', array_keys($returns)) . ')' W kolejnej pętli dodajesz odczytane wyniki tego zapytania do odpowiedniego elementu tablicy wyników: Kod $returns[$row['tag_note']['tags'][] = array( 'tag_name' => $row['tag_name'], 'tag_blog' => $row['tag_blog']); Jeżeli źle się domyślam, to pokaż na danych, które podałem jakie wyniki chcesz uzyskać. Ten post edytował Norbas 27.06.2007, 22:58:08 -------------------- |
|
|
![]()
Post
#8
|
|
![]() Grupa: Developerzy Postów: 823 Pomógł: 12 Dołączył: 18.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
Norbas, właśnie dokładnie tak mam rozwiązane kategorie linków... no inaczej chyba się nie dało.
Chciałem się dowiedzieć, czy sam wpadłem na ten pomysł i czy się nie da tego jakoś prościej. Najwidoczniej trzeba sobie to filtrować w PHP samemu, tak jak zrobiłem to z linkami i jak podałeś wyżej. No nic... trudno. Btw, ze stronnicowaniem nie będzie problemu ![]() -------------------- Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 359 Pomógł: 1 Dołączył: 16.04.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
A może najprościej zrobil LEFT JOIN notes a nie tags ?
![]() |
|
|
![]()
Post
#10
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
Panowie to jest jakas amatorka. LEFT JOIN przeciez to jak witaj swiecie.
-------------------- |
|
|
![]()
Post
#11
|
|
![]() Grupa: Developerzy Postów: 823 Pomógł: 12 Dołączył: 18.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
Cytat A może najprościej zrobil LEFT JOIN notes a nie tags ? smilingsmiley.gif Pozdrawiam, Kamil i tu może być problem z stronnicowaniem notek (dokładniej limitami), taki pomysł też miałem, bo duble notes można łatwo usunąć. Może nie tyle problem, bo to też się da. Ale jak przypisujemy po 7 - 12 tagów na notkę, to mnie się wydaje że to nie będzie wydajne. Cytat Panowie to jest jakas amatorka. LEFT JOIN przeciez to jak witaj swiecie. Coś sugerujesz? ![]() Póki co mamy 3 pomysły: - przelecieć foreachem i dokonać kolejne zapytania osobno na każdą notkę, czyli na każdą notkę osobne zapytanie o tagi (najgorsze, ale jak będzie cache to nie wiem...) - zaznaczyć tagi i joinować notki (tak jak to przedstawił Kamil) - wykonać 2 zapytania: o notki, a następnie o tagi z wyróżnieniem ID notek, które zostały wybrane i połączyć to w php (póki co najlepszy pomysł) -------------------- Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij |
|
|
![]()
Post
#12
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
Cytat Coś sugerujesz? ![]() Nie chodzilo mi o problem tylko o znajomosc LEFT JOIN -------------------- |
|
|
![]()
Post
#13
|
|
![]() Grupa: Developerzy Postów: 823 Pomógł: 12 Dołączył: 18.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
Wybrałem trzeci sposób z przedstawionych 2 posty wyżej.
Oto rozwiązanie:
Chyba najbardziej optymalne rozwiązanie. Dziękuję za dyskusję ![]() Athlan ![]() -------------------- Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 359 Pomógł: 1 Dołączył: 16.04.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
@Athlan: jedna z zasad optymalizacji skryptów - jeśli da się zrobić coś na poziomie bazy - to to zrób. Kiedys robiłem testy na zapytania do mysl'a i uwierz lepiej zrobić jedno duże zapytanie niż kilka mniejszych...
|
|
|
![]()
Post
#15
|
|
![]() Grupa: Developerzy Postów: 823 Pomógł: 12 Dołączył: 18.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
Cytat @Athlan: jedna z zasad optymalizacji skryptów - jeśli da się zrobić coś na poziomie bazy - to to zrób. Kiedys robiłem testy na zapytania do mysl'a i uwierz lepiej zrobić jedno duże zapytanie niż kilka mniejszych... Sugerujesz, żeby joinować notki do tagów i wykonać wszystkie operacje? -------------------- Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 04:55 |