Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Pobieranie danych z 3 tabel
Forum PHP.pl > Forum > Przedszkole
remik09
Po długim rozbracie z pisaniem stron, na nowo zacząłem i natrafiłem na problem z którym nie umiem sobie poradzić

Mam 3 tabele tracki, sety, cd (ich budowa nie jest tu zbytnio potrzebna), na stronę główną chciałbym dać np 10 najnowszych aktualności z tych 3 tabel sortowane wg daty. Jakim poleceniem mogę pobrać naraz z wsyzstkich 3 tabel sortując po dacie

W ostateczności mogę dodać kolejną tabelę i tam zapisywać kolejność dodawania elementów do tych tabel ale chciałbym tego uniknąć
Zosiek
Pobierasz dane z tabeli i sortujesz datami a potem wyświetlasz. (order by - sortowanie)
remik09
mógłbyś napisać kod tego polecenia bo coś czuje, że to taka strasznie lakoniczna odpowiedź, takie przekształcenie mojego pytania tylko
InosU31
moze tak :

[SQL] pobierz, plaintext
  1. SELECT * FROM tracki, sety, cd ORDER BY kolumna_z_data DESC LIMIT 10
[SQL] pobierz, plaintext

to zapytanie powinno Ci wybrac wszystko z tych trzech tabel, posegregowac po dacie ostatnio dodanych rekordow i pokazac tylko 10 wynikow

Pozdrawiam
remik09
w phpmyadminie otrzymałem coś takeigo

Kod
zapytanie SQL:  

SELECT *
FROM `tracki` , `sets` , `cds`
ORDER BY `data` DESC
LIMIT 10

MySQL zwrócił komunikat:  

#1052 - Kolumna: 'data' w  order clause jest dwuznaczna


dodam, że w każdej tabeli istnieje pole `data` i jest tego samego typu
piotrooo89
używaj aliasów. tzn: tracki.data as tdata, sets.data as sdata itd.
remik09
nie bardzo rozumiem w jakim sensie ma to pomóc, jeśli dobrze zrozumiałem działanie aliasów

a w ostateczności da się to pobrać 3 zapytaniami a potem załadować do 3 tablic array, polaczyc je i tam posegregowac je wg daty ?
salza
Cytat(piotrooo89 @ 1.11.2009, 21:41:35 ) *
używaj aliasów. tzn: tracki.data as tdata, sets.data as sdata itd.


a dokładnie:

SELECT * FROM tracki as t, sety as s, cd as c ORDER BY c.data DESC LIMIT 10

chyba, że data z tracka jest ważniejsza niż data z cd

ps. jak widać zawartość tabel jest istotna, skąd piszący wcześniej miał wiedzieć, ze w każdej tabeli masz pole "data"
remik09
przecież napisałem o tym :|

aliasy średnio pomogły ale pomogło polecenie UNION

Kod
SELECT data, wykonawca FROM `cds` UNION ALL SELECT data, wykonawca FROM `tracki`


jednak wystąpił pewien problem:

Kod
SELECT data, nazwa, wykonawca, typ, data, gatunek, link, id FROM `cds` UNION ALL SELECT data, nazwa, wykonawca, typ, data, gatunek, link, id FROM `tracki` UNION ALL SELECT data, nazwa, wykonawca, typ, data, gatunek, link, id FROM `sets` LIMIT 10


pobiera dobrze z 2 tabel ale trzecią mi już pomija
piotrooo89
chłopie jak sie utrudniasz... robisz jakieś zapytanie nie wiem skąd a możesz mieć bardziej optymalne używając aliasów...
phpion
Cytat(remik09 @ 2.11.2009, 15:29:17 ) *
Kod
SELECT data, nazwa, wykonawca, typ, data, gatunek, link, id FROM `cds` UNION ALL SELECT data, nazwa, wykonawca, typ, data, gatunek, link, id FROM `tracki` UNION ALL SELECT data, nazwa, wykonawca, typ, data, gatunek, link, id FROM `sets` LIMIT 10


pobiera dobrze z 2 tabel ale trzecią mi już pomija

A tak?
  1. SELECT * FROM (SELECT DATA, nazwa, wykonawca, typ, DATA, gatunek, link, id FROM `cds` UNION ALL SELECT DATA, nazwa, wykonawca, typ, DATA, gatunek, link, id FROM `tracki` UNION ALL SELECT DATA, nazwa, wykonawca, typ, DATA, gatunek, link, id FROM `sets`) t ORDER BY `data` DESC LIMIT 10;
remik09
nie wiem czy do końca mój problem jest rozumiany, ja chcę uzyskać wszystkie rekordy z tych tabel jednym zapytaniem, żeby mozna było je posortować wg daty. Używając aliasów 2 tabele łączą mi się w jedną i każdy rekord ma np 2 razy id, 2 razy date itp., anie o to mi chodzi

id|data|wykonawca|gatunek
--|-----|-------------|---------
1 |2106|abcd |HC
2 |4627|dadzc |HC

id|data|wykonawca|gatunek
--|-----|-------------|---------
1 |9136|czczc |HC
2 |4657|dadacz |HC

takie coś mi wychodzi

id|data|wykonawca|gatunek|id|data|wykonawca|gatunek
--|-----|-------------|-------------------------------------------
1 |2106|abcd |HC |1|9136|czczc |HC
2 |4627|dadzc |HC |2|4657|dadacz |HC

a ja chce otrzymać

id|data|wykonawca|gatunek
--|-----|-------------|---------
1 |9136|czczc |HC
2 |4657|dadacz |HC
1|2106 |abcd |HC
2|4627 |daadzc |HC




phpion, niestety wywala błąd od razu
phpion
Dlatego tak się dzieje, bo ci twardziele każą Ci robić iloczyn kartezjański tabel, w wyniku którego dostaniesz zbiór każdy-z-każdym. Bazuj na przykładzie podanym przeze mnie - powinno działać tak, jak chcesz.
piotrooo89
pokaż struktury tabel... i powiedz jak powinny wyglądać dane wynikowe. bo tak to błądzimy po omacku.
phpion
Cytat(piotrooo89 @ 2.11.2009, 16:05:55 ) *
pokaż struktury tabel... i powiedz jak powinny wyglądać dane wynikowe. bo tak to błądzimy po omacku.

Nie błądzimy po omacku tylko niektórzy nie wiedzą o czym piszą. Kolega jasno napisał co chce osiągnąć.
remik09
Cytat(phpion @ 2.11.2009, 14:50:52 ) *
  1. SELECT * FROM (SELECT DATA, nazwa, wykonawca, typ, DATA, gatunek, link, id FROM `cds` UNION ALL SELECT DATA, nazwa, wykonawca, typ, DATA, gatunek, link, id FROM `tracki` UNION ALL SELECT DATA, nazwa, wykonawca, typ, DATA, gatunek, link, id FROM `sets`) t ORDER BY `data` DESC LIMIT 10;


jak już napisałem bo chyba nei zauważyłeś niestety wywala błąd

  1. #1064 - Something is wrong in your syntax obok 'SELECT DATA, nazwa, wykonawca, typ, DATA, gatunek, link, id FROM' w linii 1

piotrooo89
  1. SELECT `id`, `data`, `wykonawca`, `gatunek` FROM tab1
  2. UNION
  3. SELECT `id`, `data`, `wykonawca`, `gatunek` FROM tab2


może tak?
remik09
sory jednak to co wcześniej pisałem było dobre

Kod
SELECT data, nazwa, wykonawca, typ, data, gatunek, link, id FROM `cds` UNION ALL SELECT data, nazwa, wykonawca, typ, data, gatunek, link, id FROM `sets` UNION ALL SELECT data, nazwa, wykonawca, typ, data, gatunek, link, id FROM `tracki` ORDER BY data LIMIT 10


jednak działa dobrze, jest pobieranie z 3 tabel

@piotrooo89 - więc jeśli wyszło mi to co chciałem to chciałbym abyś mi pokazał kod z aliasami, który zrobi dokładnie to samo, bo się ich tak czepiłeś a ja w ogóle nie wiem jak je można tu wykorzystać. Dla mnei to jedyne polecenie, które może zrobić to co ja chciałem
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.