• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Złożone zapytanie do bazy danych

Object Storage Arubacloud
0 głosów
711 wizyt
pytanie zadane 24 maja 2017 w SQL, bazy danych przez Rafik Obywatel (1,870 p.)
Witam!

Mam dwie tabele w BD do których mam wrzucone dane i powiązane one są ze sobą "sygnratura" W pierwszej tabeli dla danej sygnatury jest przyporządkowany tylko jeden wpis więc tutaj nie ma problemu w przypadku drugiej tabeli dla danej sygnatury przyporządkowanych jest kilka wpisów. Chciałbym teraz z 1 tabeli wyciągnąć dane dla konkretnego rekordu, a z 2 tabeli wyciągnąć tylko jeden rekord o najmniejszym dla danej sygnatury id.

Wiec pytanie mam takie czy da radę to zrobić jednym zapytaniem ? Czy muszę robić dwa osobne zapytania dla każdej z tabeli ?

2 odpowiedzi

0 głosów
odpowiedź 24 maja 2017 przez Assasz Nałogowiec (30,460 p.)
wybrane 24 maja 2017 przez Rafik
 
Najlepsza

Bazując na podanym przez Ciebie przykładzie, to byłoby mniej więcej tak:

SELECT * FROM tabela1 INNER JOIN tabela2 ON tabela1.sygnatura=tabela2.sygnatura ORDER BY tabela2.id ASC LIMIT 1

 

komentarz 24 maja 2017 przez Rafik Obywatel (1,870 p.)
Tylko że ja bym chciał, że jeżeli w tabeli 1 mam 10 filmów (każdy z osobną sygnaturą) to on mi wyrzuci listę 10 tytułów i do każdego tytułu z tabeli 2 przypisze jedno zdjęcie o najmniejszym ID dla tej sygnatury. A teraz wyświetla mi tylko jeden rekord mimo, że w tabeli1 mam dwa rekordy z dwoma różnymi sygnaturami
komentarz 24 maja 2017 przez Assasz Nałogowiec (30,460 p.)

To może tak:


SELECT * FROM tabela1 LEFT JOIN tabela2 ON tabela1.sygnatura=tabela2.sygnatura GROUP BY tabela1.sygnatura ORDER BY tabela2.id ASC


komentarz 24 maja 2017 przez Rafik Obywatel (1,870 p.)
O to właśnie mi chodziło

Wielkie dzięki!
komentarz 2 czerwca 2017 przez Rafik Obywatel (1,870 p.)

A  mam jeszcze jedno pytanie przyjmijmy, że ma kilka tabel np: każda tabela to inny rodzaj filmu i mam tam informacje czy dany film dostał Oscara i chciałbym wyciągnąć z tych kilku tabel wszystkie filmy które dostały Oscara oraz z tabeli zdjęcia ich jedno zdjęcie.

Próbowałem poprzez WHERE:

SELECT * FROM tabela1, tabela2, tabela3, tabela4 LEFT JOIN tabela5 ON tabela1.sygnatura=tabela5.sygnatura, tabela2.sygnatura=tabela5.sygnatura, tabela3.sygnatura=tabela5.sygnatura, tabela4.sygnatura=tabela5.sygnatura WHERE oscar='tak' GROUP BY tabela1.sygnatura ORDER BY tabela5.id ASC

Ale cały czas wyskakuje mi błąd:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in 

komentarz 2 czerwca 2017 przez efiku Szeryf (75,160 p.)

każda tabela to inny rodzaj filmu 

Schemat bazy danych popraw ;) błąd projektowy się wkradł, widać nawet po zapytaniu powyżej :) 

komentarz 8 czerwca 2017 przez Rafik Obywatel (1,870 p.)
Kilka dni mnie nie było i dopiero teraz zasiadałem do tego z powrotem

Ale jak schemat bazy danych ?

Baza danych zawiera 5 tabel 4 z filmami jedną ze zdjęciami:

Tabele: komedia, romans, horror, dokumentalny

w każdej tabeli są komórki: id, sygnatura, tytul, opis, oscar, rezyser

Tabela ze zdjęciami: id, sygnatura, nazwa, lokalizacja

i teraz chciałbym wyciągnąć z tych wszystkich tabel filmy które dostały oscara ( WHERE oscar = 'tak'). Co prawda udało mi się zniwelować błąd, ale teraz wyświetla mi tylko i wyłączenie dane z pierwszej zapisanej tabeli.
1
komentarz 8 czerwca 2017 przez Assasz Nałogowiec (30,460 p.)
Chodzi o to, że masz źle skonstruowaną bazę danych. Powinieneś mieć 2 tabele, jedną z filmami (wraz ze zdjęciami, o ile jeden film ma przypisane jedno zdjęcie), a drugą z kategoriami połączoną relacją jeden do wielu z filmami (jeden film może mieć jedną kategorię, jedna kategoria może mieć wiele filmów). W ten sposób wykonywanie zapytań byłoby o wiele prostsze.
komentarz 8 czerwca 2017 przez Rafik Obywatel (1,870 p.)
Niestety nie mogę się ograniczyć do 2 tabel. Tutaj podałem jedynie przykład to co chce osiągnąć. Natomiast moja BD składa się z 8 tabel z danymi i 1 tabeli ze zdjęciami relacja pomiędzy tabelami z danymi a zdjęciami ( których dla danego "filmu" może być nawet kilkanaście) jest komórka "sygnatura" we wszystkich tabelach cześć danych które wprowadzam są podobne natomiast część w niektórych tabelach w ogóle nie występuje dlatego postanowiłem zrobić aż 8 tabel żeby wszystko mieć konkretnie poukładane i teraz z tych 8 tabel chciałbym wyciągnąć rekordy z konkretną wartością ( czyli tak jak w przykładzie filmy z Oscarem)
0 głosów
odpowiedź 24 maja 2017 przez gromula Stary wyjadacz (10,070 p.)
Jeśli możesz, wstaw strukturę bazy abyśmy dobrze się zrozumieli.
komentarz 24 maja 2017 przez Rafik Obywatel (1,870 p.)

Może podam przykład.

Powiedzmy, że chcę wyświetlić z bazy danych listę filmów. Ale chodzi mi jedynie o wyciągnięcie kilku informacji. I tak z tabeli numer 1 chce wyciągnąć jedynie tytuł i rodzaj filmu o danej sygnaturze ( to wiem jak zrobić) i tutaj znajduje się tylko jeden taki rekord. Natomiast z tabeli 2 chce wyciągnąć zdjęcie dla danego filmu ale tylko jedno i o najmniejszym ID ponieważ w tej tabeli rekordów o danej sygnaturze może być kilkanaście. Relację w obu tabelach powiązane są sygnaturą, więc czy w jednym zapytaniu mogę wyciągnąć jeden rekord z tabeli 1 i jeden rekord z tabeli 2 o danej sygnaturze ale o  najmniejszym  id.

komentarz 24 maja 2017 przez gromula Stary wyjadacz (10,070 p.)
Wrócę do domu, to napiszę CI jak to rozwiązać, oraz zaproponuję Ci jeszcze jedno podejście.

Podobne pytania

0 głosów
1 odpowiedź 333 wizyt
0 głosów
2 odpowiedzi 307 wizyt
pytanie zadane 23 kwietnia 2017 w SQL, bazy danych przez niezalogowany
0 głosów
1 odpowiedź 463 wizyt
pytanie zadane 15 lutego 2018 w PHP przez daniel2k Obywatel (1,380 p.)

92,555 zapytań

141,400 odpowiedzi

319,537 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...