Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z zapytaniem
Forum PHP.pl > Forum > Bazy danych > MySQL
revyag
Witam.

Mam dwie tabelki:

users:
Kod
-----------------------------------------------
id | nazwisko | imie  | wiek   | adres    |
----------------------------------------------
1  | Kowalski | Jan   |  45    | cos tam  |
2  | Nowak    | Adam  |  35    | cos tam  |
------------------------------------------------

user_langs:
Kod
-----------------------------------------
id | uid  | lang      | level      |
------------------------------------------
1  |  1   | angielski | biegły     |
2  |  1   | niemiecki | dobry      |
3  |  1   | rosyjski  | podstawowy |
4  |  2   | angielski | dobry      |

Powiązane są poprzez id z tabeli gównej które jest kluczem obcym w user_langs (uid).
Mam kłopot ze skonstruowaniem zapytania które będzie wyszukiwało dane.
Jeśli chcę wyciągnąć userów, którzy umieją po jednym języku na odpowiednim poziomie to jest ok, ale nie wiem jaką postać ma mieć zapytanie jeśli chcę pobrać z bazy userów którzy umieją np. język angielski i niemiecki na określonych poziomach.
Poza tym przy wyszukiwaniu języki mogą nie być określone czyli, mogą być wyszukiwani userzy bez kryteriów nałożonych na język.
Dla jednego lub nieokreślonego(wszystkie) języka wymyśliłem coś takiego:
  1. <?php
  2.  
  3. $query = &#092;"select distinct u.id,u.nazwisko,u.imie,u.adres,u.wiek from users as u,user_
    l
  4. ngs as ul
  5. where
  6. u.nazwisko like '%$n%' and u.imie like '%$i%' and u.adres like '%$a%' and u.wiek like '%$w%' and
  7. ul.lang like '%$l%'and ul.level like '%$ll%' and u.id = ul.uid&#092;"; 
  8.  
  9. ?>

Zmienne $n,$i itd. to dane z formularza przesyłane postem.
Jeśli to lamerskie pytanie to sory smile.gif
Z góry dzięki za pomoc smile.gif
------------------------
Edit:
zapomniałem dodać, że chciałbym to zrobić jednym zapytaniem smile.gif
popbart
Cytat
nie wiem jaką postać ma mieć zapytanie jeśli chcę pobrać z bazy userów którzy umieją np. język angielski i niemiecki na określonych poziomach.

  1. SELECT uid
  2. FROM user_lang WHERE (lang='angielski' AND level='biegly') OR (lang='niemiecki' AND level='podstawowy')
  3. GROUP BY uid
  4. HAVING count(id)>=2

Przydałyby się tabele:lang(id,nazwa) i level(id,poziom int,nazwa)
pole "poziom int" by się przydało do zapytań typu: " kto zna niemiecki dobrze lub lepiej a angielski dobrze lub gorzej ".
Cytat
Poza tym przy wyszukiwaniu języki mogą nie być określone czyli, mogą być wyszukiwani userzy bez kryteriów nałożonych na język.

To już zadanie dla php aby odpowiednio przygotowało zapytanie.
Pzdr
revyag
Hej. Dzięki za odpowiedź, ale to nie działa tak jakbym chciał. Wyszukiwane są osoby, które umieją albo angielski albo niemiecki, a muszą być wyszukane te które umieją obydwa te języki.
Być może źle stosuję przykład który podałeś. Nie jestem ekspertem w bazach i nie wiem co ma dać ten fragment:
  1. GROUP BY uid
  2. HAVING count(id)>=2

Poza tym czy mogę użyć tego w zapytaniu w którym odwołuję się do kilku tabel ? Jeśli tak, to gdzie mam tą klauzulę umieścić ?
Kas
Nie chcę się tam zbyt wymądrzać, ale moim skromnym zdaniem to powinno być chyba tak...

  1. SELECT uid
  2. FROM user_lang WHERE (lang='angielski' AND level='biegly') AND (lang='niemiecki' AND level='podstawowy')
  3. GROUP BY uid
  4. HAVING count(id)>=2


Ale nie jestem pewien. smile.gif
revyag
Niestety nie. To zapytanie nie zwraca żadnych rekordów.
Kas
A powinno. mad.gif

Już chyba wiem w czym błąd.
Ale nie pamiętam jak to się robiło.
brachu
a nie prosciej by Ci bylo przerobic strukture tabel?questionmark.gif bo ta struktura jest troche do d.... za przeproszeniem!!!
revyag
Wydawało mi się że jest to w miarę prosto zrobione. Jeśli masz jakieś propozycję to proszę. Samo powiedzenie że coś jest be mi nie pomoże snitch.gif
brachu
hmmm no trzeba by sie zastanowic wlasnie jak pozniej bedzie latwo odczytac dane z tabeli.... jezeli tych jezykow nie jest zbyt duzo to proponowalbym dac w tabeli user_langs kazdy jezyk jako osobna kolumne - a wartosciami w tej kolumnie bylaby informacja na jakim poziomie uzytkownik zna ten jezyk smile.gif

edyt.1

mozna zrobic jeszcze inaczej ze kazdy jezyk bedzie mial osobna tabele i tam beda wartosci jak kto zna dany jezyk winksmiley.jpg ogolnie mozliwosci jest wiele

pozdrawiam
revyag
1. Rozwiązanie pierwsze odpada, bo liczba języków nie może być ustalona z góry, jest zależna od tego ile user ich poda.
2. Rozwiązanie drugie też nie za bardzo będzie sią dało wprowadzić. Dlaczego ? Patrz punkt1, ilość języków nie może być ustalona.

Problem sprowadza się do jednej rzeczy: czy da się wyciągnąć z tabeli tylko te wiersze, które odpowiadają dwóm lub więcej kryteriom ? Tutaj tymi kryteriami są języki.
brachu
kurde poszperalem posiedzialem i chyba wymyslilem jak zrobic to zapytanie - a konkretniej jak przerobic zapytanie @popbart i zadzialalo mi co najwazniejsze biggrin.gif
  1. SELECT DISTINCT(uid)
  2. FROM `user_langs` WHERE (lang='angielski' AND level='biegly') OR (lang='niemiecki' AND level='podstawowy') GROUP BY uid HAVING count(uid)>=2
mi to dziala biggrin.gif

edyt.1

a odnosnie klauzuli:
  1. GROUP BY uid HAVING count(uid)>=2
to grupuje ona po uid i umozliwia zastosowanie count(uid)>=2 czyli przekladajac z polskiego na naski to zapytanie ma postac: jezeli znajdziesz rekordy z jezykiem angielskim w poziomie bieglym lub jezykiem niemickiem w poziomie podstawowym i tych rekordow bedzie conajmniej dwa to zwroc wartosc uid biggrin.gif

pozdrawiam
revyag
Sprawdziłem no i rzeczywiście to jest to co chcę osiągnąć smile.gif.
Muszę to teraz wpasować w moje zapytanie operujace na kilku tabelach.
Dzięki za pomoc smile.gif
popbart
Moje zapytanie może nie działać tylko w jednym wypadku:
jeżeli user ma dwa lub więcej wpisy dla jednego języka (angielski,dobrze)(angielski,podstawowy).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.