Jak wykonac takie zapytanie? MYSQL

0

Czesc od wczoraj staram sie napisac pewne zapytanie do bazy. Poddalem sie, nie wiem jak wykonac takie zapytanie, mam nadzieje ze znajdzie sie ktos kto pomoze mi w tym problemie. Otoz co chce wykonac przedstawia sie mniej wiecej tak.

Mamy tabele **WynikiNagrodyGlownej **w ktorej mamy *id,id_wygranego,id_konkursu * oraz druga tabele **KONKURS **w ktorej sa id,nazwa_konkursu i kilka jeszcze innych ale to juz nie ma znaczenia. Tworze relacje miedzy tymi tabelami instrukcja JOIN, gdzie id_konkursu = id w tej tabeli konkurs.

Chcialbym abym mogl dla konkretnego id_usera przy pomocy klauzuli WHERE zobaczyc taki wynik mniej wiecej:

id_usera | id_konkursu|nazwa_konkursu | czy_user_wygral_nagrode_glowna

Jak mozna sie domyslec w kolumnie czy_user_wygral_nagrode_glowna chcialbym aby tworzyly sie wiersze 'TAK' lub 'NIE'.

Generalnie probowalem to w taki sposob, ze chcialem najpierw chcialem wyswietlic konkursy ktory dany user wygral i to jest bardzo prosto osiagnac, ale nie bardzo wiem jak polaczyc to z reszta wynikow aby razem wspolgraly.

0

To jest troszkę bez sensu.

Mamy tabele WynikiNagrodyGlownej w ktorej mamy id,id_wygranego,id_konkursu oraz druga tabele KONKURS w ktorej sa id,nazwa_konkursu i kilka jeszcze innych ale to już nie ma znaczenia. Tworze relacje miedzy tymi tabelami instrukcja JOIN, gdzie id_konkursu = id w tej tabeli konkurs.

Jeżeli bazujemy tylko na tych dwóch tabelach, bez dodatkowej tabeli userów, możemy zebrać co najwyżej wszystkie idki, które kiedykolwiek wygrały w konkursie. Bez bazy wszystkich userów biorących udział w konkursie, będzie ciężko wyznaczyć: czy_user_wygral_nagrode_glowna.
Jeżeli bierzemy pod uwagę pytanie: Czy user kiedykolwiek wygrał nagrodę główną? To przy podanych przez Ciebie informacjach odpowiedź zawsze będzie na TAK.

Sądząc po strukturze bazy na podstawie tych dwóch tabel, nie jestem także w stanie wyznaczyć userów, którzy zajęli chociażby drugie miejsce.

0

To znaczy tak, zapomnialem dodac ze jest jeszcze tabela userow, gdzie mamy kolumne id i joinujemy, ale to i tak mi nic nie daje aby to wykonac.

0

Ja bym zmienił troszeczkę strukturę tabeli: **WynikiNagrodyGlownej **

Tak aby zawierała:
Id,
Id_usera,
Id_konkursu,
wynik

Zmieniłbym jej nazwe na Wyniki_konkursow

Wtedy będzie można nie dość, że sprawdzić czy dany user wygrał dany konkurs, to też, będzie można sprawdzić, które miejsce zajął.

0

Ale tutaj nie chodzi o drugie miejsce. Chodzi mi o sama nagrode glowna. Po prostu dla kazdego usera wyznaczyc wszystkie konkursy a obok kolumna czy dany user wygral ta nagrode glowna czy nie.

0

No moge tak zrobic, chociaz i tak potrzebuje tylko tej jednej danej ale no na przylosc. Tylko do tej pory nie bardzo wiem jak tworzyc zapytania tak jakby z dwoch wynikow i dodatkowo stworzyc tam kolumne ktora bedzie sie odnosila do tych wynikow. Probowalem cos z CASE ale nie wychodzilo niestety.

0

Twoja struktura w tej chwili wygląda tak, że jeżeli user jest podpięty pod konkurs, to automatycznie można od razu wyświetlić mu 'TAK'.

Jeżeli zaś user nie brał udziału w konkursie, można mu automatycznie dopisać 'NIE'.

Nie ma w Twojej strukturze, usera, który wziąłby udział w konkursie i nie wygrał. EDIT: Nie ma więc sensu zupełnie wyświetlać userów, którzy nie brali udziału w konkursach, ergo odpowiedź 'NIE', nigdy nie będzie wykorzystana.

Twój select może więc wyglądać tak:

 
SELECT u.id, k.id, k.nazwa_konkursu, 'TAK' as czy_user_wygral_nagrode_glowna
FROM KONKURS k, WynikiNagrodyGlownej wn, Uzytkownik u
WHERE k.id = wn.id_konkursu 
AND u.id = wn.id_wygranego
AND wn.id_wygranego = JakiesID;

Tyle, że jest to bzdura totalna.

0

To znaczy ja potrzebuje takiego zapytania do php, wiec taki rezultat wydalby mi sie najlepszy. Po prostu potrzebowalbym calej tabeli konkurs ale z dodatkowa kolumna, w ktorej moglbym identyfikowac, czy user wygral nagrode glowna czy nie, ale potrzebowalbym wlasnie calej takiej listy konkursow, ale dla kazdego usera kolumna z tymi wynikami bylaby inna.

0

Masz błąd na poziomie budowy struktury bazy danych. Nie jesteś w tej chwili w stanie wygenerować użytkowników, którzy nie wygrali w konkursie. Możesz jedynie wygenerować użytkowników, którzy nie brali w ogóle udziału w żadnym konkursie. Nie umiem tego prościej wytłumaczyć.

0

To w jaki sposob musialbym polaczyc tabele abym mogl to zobaczyc?

0

Ale ja juz ta strukture zmienilem, mam 3 tabele oraz zamienilem jedna kolumne na wyniki, tak jak napisales wczesniej.

0

To teraz pytanie co zawiera kolumna wyniki. Jaki wynik wskazuje na pierwsze miejsce?

Punktacja może być procentowa: 0-100 --> 100 = 1 pierwsze miejsce,
punktacja od razu może wskazywać miejsce: 1-10 --> 1 = 1 pierwsze miejsce.

W jakiej formie prowadzisz punktację?

0

Int w kolumnie wyniki to konkretne miejsce, uwazam ze to prostszy sposob.

0

punktacja od razu może wskazywać miejsce: 1-10 --> 1 = 1 pierwsze miejsce.

  • ten sposob.
0

Pisane na kolanie, więc być może są jakieś literówki:

 
Select u.id, k.id, k.nazwa_konkursu, 
         CASE 
          When wk.wynik = 1 THEN 'TAK'
          ELSE 'NIE'
         END as Pierwsze_miejsce
FROM KONKURS k, Wyniki_konkursow wk, Uzytkownik u
WHERE k.id = wk.id_konkursu AND u.id = wk.id_usera
AND wk.id_usera = JakiesID;

To powinno wyświetlić Ci wszystkie konkursy w którym dany user brał udział z informacją czy wygrał, bądź też nie.

0

Niedlugo to sprawdze ale mam jeszce jedno pytanie na szybko. Wczoraj rowniez pisalem sobie konstrukcje case zrobilem cos takiego mniej wiecej

 
CASE users.id
WHEN '1' THEN 'wygral'
ELSE 'nie wygral'
END AS wynik

I wynik tego kodu byl taki, ze robil to na odwrot, czyli jesli users.id byl 1 to wykonywal sie else i w rezultacie dostalem poprawna ilosc wynikow ale zapis byl z else. O co tutaj chodzi?

0

Niestety pojawia mi sie to co wczoraj, a mianowicie nie pojawiaja sie konkursy ktore nie sa zwiazane z id nie pojawiaja sie, sa tylko te ktore maja relacje.

0

Zrobilem to nieco inaczej. Pobawilem sie z leftjoin i wyszedl efekt ktory chce z tym, ze bedzie potrzebna koretka poniewaz, wyskakuja mi wartosc NULL dla tabeli B nie zwiazanych ze soba, a to moze oznaczac dwie opcje, albo nic nie wygral, albo takiego id uzytkownika nie ma, dlatego pomyslalem o jakims ifie, zeby wykonywal to co sie dzieje w ogole tylko dla istniejecaych uzytkownikow.

1 użytkowników online, w tym zalogowanych: 0, gości: 1