konto usunięte

Temat: W jaki sposób mądrze to wyświetlić

Mam dwie tabele połączone ze sobą relacją.
1. oferty
2. wybrane opcje
Potrzebuję wyświetlić to np. w postaci, wyciągam 10 oferty i skrótowo do każdej pokazuję maksymalnie 2 wybrane opcje.
W chwili obecnej wyciągam z bazy 10 ofert, a później wewnątrz wykonuję zapytanie aby dostać się do 'wybranych opcji'

SELECT oferty
while (wyswietlaofertę) {

SELECT opcji dla odpowiedniej oferty
while(wyświetlopcję) {

}

}

Przepraszam za pseudo kod ale on szybko obrazuje o co mi chodzi. Czy jest jakiś elegantszy sposób aby takie coś realizować ? Bo to chyba głupiego robota tyle zapytań do bazy .. :)
Niby fajniej zrobić JOIN LEFT, ale wtedy nie wiem jak to ładniej wyświetlać. Proszę mnie ukierunkować teoretycznie ;)
Adam Bąk

Adam Bąk Programista

Temat: W jaki sposób mądrze to wyświetlić

Pokaż schemat bazy
Michał Płonka

Michał Płonka Programista PHP

Temat: W jaki sposób mądrze to wyświetlić

Zaprezentowany sposób to najgorszy z możliwych. Dla n ofert wykonujesz n+1 zapytań. Rozwiązania są 3:

1. Pobierasz oferty. Iterujesz po każdym elemencie, do tablicy zapisujesz ID oferty. W ten sposób otrzymujesz tablicę z ID wybranych ofert. Następnie wykonujesz drugie zapytanie pobierające opcje dla wszystkich (!!) ofert (czyli WHERE oferta_id IN (1, 2, 3) gdzie 1, 2, 3 to identyfikatory ofert). Musisz jeszcze obrobić ten wynik w PHP tj. przypisać do elementów ofert elementy opcji.

2. Jeśli znasz lub jakoś możesz określić ilość ofert albo ich identyfikatory to zainteresuj się UNION. Za pomocą niego poskładasz kolejne zapytania w jedno. Wydaje mi się jednak, że pierwsze rozwiązanie będzie wydajniejsze (w UNION pobierzesz nadmiarową liczbę danych - zduplikowane informacje o ofercie).

3. Podzapytanie i GROUP_CONCAT. To jednak może być średnio wydajne ;)

konto usunięte

Temat: W jaki sposób mądrze to wyświetlić

Moim zdaniem schemat tutaj nic nie da, chodzi mi o podejście teoretyczne. No ale ok:

[Oferta]
OfertaId
OfertaAutor (fk)
OfertaTresc
Oferta...

[Opcja]
OpcjaId
OpcjaOferta (fk)
OpcjaTresc

Jak zrobię złączenie to otrzymam
oferta 1 ... opcja 1
oferta 1 ... opcja 2
oferta 2 ... opcja 1
oferta 2 ... opcja 2
Więc tak czy inaczej i tak muszę użyć 2 pętli do tego, Tylko jak wygodnie to rozwiązać ;)
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: W jaki sposób mądrze to wyświetlić

Abstrahując od DBMSa i różnych dostępnych opcji to można np tak:


SELECT oferta,
(SELECT min(opcja) FROM wybrane_opcje where ofertaid = opcjaoferta) as opcja1,
(SELECT max(opcja) FROM wybrane_opcje where ofertaid = opcjaoferta) as opcja2
FROM oferty


Jeżeli zawsze masz 2 lub więcej opcji do wybranych ofert, i jeżeli chcesz pobierać tylko 2 opcje do każdej ofertyGrzegorz Drzymała edytował(a) ten post dnia 21.10.10 o godzinie 16:10

konto usunięte

Temat: W jaki sposób mądrze to wyświetlić

1. Pobierasz oferty. Iterujesz po każdym elemencie, do tablicy zapisujesz ID oferty. W ten sposób otrzymujesz tablicę z ID wybranych ofert. Następnie wykonujesz drugie zapytanie pobierające opcje dla wszystkich (!!) ofert (czyli WHERE oferta_id IN (1, 2, 3) gdzie 1, 2, 3 to identyfikatory ofert). Musisz jeszcze obrobić ten wynik w PHP tj. przypisać do elementów ofert elementy opcji.

to chyba jest najlepsze rozwiązanie moim zdaniem, jeszcze lepsze niż robienie złączenia, bo nie będę pobierał nadmiarowo kilkukrotnie tych samych danych z ofert :)



Wyślij zaproszenie do