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

Jak powinno wyglądać zapytanie relacyjne?

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
582 wizyt
pytanie zadane 21 czerwca 2017 w SQL, bazy danych przez BlvckFox Gaduła (4,240 p.)

Witam. Posiadam 3 tabele:

W USERS przechowuje id uzytkownika i jego nick, w IMAGES id obrazka, id uzytkownika (autora obrazka) a w SIMAGES przechowuje id uzytkownika i id obrazka, który juz widział.

Moje zapytanie wygląda następująco:
 

$sql = $conn->query("SELECT images.*, users.username FROM images, users WHERE users.id = images.author ORDER BY RAND() LIMIT 1"))

Wszystko działa poprawnie ale chciałbym, żeby uzytkownik widzial tylko raz dany obrazek więc tutaj moje pytanie: Czy w SQL istnieje coś w stylu "oprócz" np. "WITHOUT images.id = simages.imgID AND users.id = simages.userID"?

Jeżeli nie to jak powinna wyglądać relacja i pytanie warunkowe lub pętla która by sprawdzała czy user id i image id w tabeli SIMAGES są takie same jak wylosowane obecnie i losowanie ma być powtórzone tyle razy ile jest wszystkich id w tabeli images a jak wszystkie zostaly juz zobaczone to wykona sie inny kod np:
"echo "Widziales juz wszystkie obrazki! Poczekaj lub dodaj wlasny!"

komentarz 21 czerwca 2017 przez X3h Dyskutant (9,540 p.)

Select * From IMAGES Where id In (Select id From IMAGES Union All Select imgID as id From SIMAGES Where userID = (Select id From USERS Where name = 'imię'))

Być może Union poprawnie odejmie id z IMAGES i imgID jako id z SIMAGES wtedy powinieneś uzyskać wszystkie id IMAGES nie widzianych przez użytkownika o podanym imieniu. Na końcu bez problemu powinieneś wybrać IMAGES po id zawierających się we wcześniej znalezionych id. 

komentarz 21 czerwca 2017 przez Ehlert Ekspert (214,270 p.)
Select * From IMAGES Where id In (Select id From IMAGES Union All Select imgID as id From SIMAGES Where userID = (Select id From USERS Where name = 'imię'))

No to jest morderstwo serwera. Słyszałeś może o JOIN??

1
komentarz 22 czerwca 2017 przez X3h Dyskutant (9,540 p.)
Myślę że moja propozycja rozwiązania tego skomplikowanego zapytania jest całkiem w porządku. Daj znać jak napiszesz swoją idee. Powiedz również gdzie i dlaczego jesteś pewien, że Join zmieniłby cokolwiek. Być może serwer SQL zaplanuje akurat twój przypadek dużo lepiej. W sumie to fajnie byłoby zobaczyć mapę twojego zapytania w stosunku do mojego. Musimy przecież na czymś się opierać aby znaleźć najlepsze rozwiązanie. Czekam i pozdrawiam.

1 odpowiedź

0 głosów
odpowiedź 21 czerwca 2017 przez Patryk Rafał Bywalec (2,700 p.)
jak bym zrobił to tak pobrał sobie w licznik wszystkie zdjęcia czyli select count(*) from nazwa tabeli
i po wyświetleniu każdego licznik dekrementował aż do zero i wtedy wypisywał "echo "Widziales juz wszystkie obrazki! Poczekaj lub dodaj wlasny!"

Podobne pytania

0 głosów
1 odpowiedź 1,155 wizyt
0 głosów
0 odpowiedzi 388 wizyt
pytanie zadane 17 lutego 2021 w SQL, bazy danych przez icytower Bywalec (2,170 p.)
0 głosów
0 odpowiedzi 301 wizyt
pytanie zadane 16 września 2023 w SQL, bazy danych przez martinez369 Użytkownik (520 p.)

93,103 zapytań

142,075 odpowiedzi

321,554 komentarzy

62,444 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...