• 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?

Object Storage Arubacloud
0 głosów
477 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 (212,870 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,000 wizyt
0 głosów
0 odpowiedzi 329 wizyt
pytanie zadane 17 lutego 2021 w SQL, bazy danych przez icytower Bywalec (2,110 p.)
0 głosów
0 odpowiedzi 225 wizyt
pytanie zadane 16 września 2023 w SQL, bazy danych przez martinez369 Początkujący (460 p.)

92,669 zapytań

141,567 odpowiedzi

320,033 komentarzy

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

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!

...