Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Problem z funkcja count
Forum PHP.pl > Forum > Bazy danych > MySQL
agentmullder
Dzien dobry wszystkim. Potrzebuje pomocy w wyszukaniu bledu mojego zapytania. Na czym problem polega:

Majac dwie tabele:

a)
  1. CREATE TABLE `uczniowie` (
  2. `user_id` tinyint(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `user_name` varchar(13) NOT NULL,
  4. `user_password` varchar(40) NOT NULL,
  5. PRIMARY KEY (`user_id`)
  6. )


cool.gif
  1. CREATE TABLE `nauczyciele` (
  2. `user_id` tinyint(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `user_name` varchar(13) NOT NULL,
  4. `user_password` varchar(40) NOT NULL,
  5. `user_stanowisko` varchar(13) NOT NULL,
  6. `user_staz` int(13) NOT NULL,
  7. `user_pensja` float(13) NOT NULL,
  8. `user_stawka` float(13) NOT NULL,
  9. `user_wiek` int(13) NOT NULL,
  10. PRIMARY KEY (`user_id`)
  11. )



... chcialbym wykonac zapytanie przy logowaniu na stronie php, ktore sprawdzi do jakiej tabeli przynalezy dany uzytkownik. Oczywiscie uzytkownik X nie moze nalezec do jednej i drugiej tabeli.

  1. INSERT INTO `uczniowie` (`user_id`, `user_name`, `user_password`) VALUES ('1','testtest','12345678');

  1. INSERT INTO `nauczyciele` (`user_id`, `user_name`, `user_password`,`user_stanowisko`,`user_staz`,`user_pensja`,`user_stawka`,`user_wiek`) VALUES ('1','testtest','12345678','Matematyk','3','1200','50','40');


Moje zapytanie:
  1. SELECT user_name FROM uczniowie WHERE user_name = 'testtest' AND user_password= '12345678' UNION SELECT user_name FROM nauczyciele WHERE user_name = 'xxxx' AND user_password= 'xxxxxx'
  2. ;


Powyzsze zapytanie dziala poprawnie. Ale potrzebuje to zliczyc przy pomocy funkcji count(*), wiec:

  1. SELECT count(*) FROM (
  2. SELECT user_name FROM uczniowie WHERE user_name = 'testtest' AND user_password= '12345678' UNION SELECT user_name FROM nauczyciele WHERE user_name = 'xxxx' AND user_password= 'xxxxxx'
  3. );


Nie dziala juz. Czy macie jakies propozycje jak zastosowac counta aby zapytanie dzialalo poprawnie?
thek
A nie zauważyłeś jednej prostej rzeczy? Skoro obie te tabele są identyczne strukturalnie, to prościej stworzyć jedną z kolumn typ, gdzie 0 to uczeń a 1 to nauczyciel. W ten sposób user z tymi samymi danymi może być z mostu odrzucony do zapisu jeśli położysz index unique na username. Eliminuje Ci to potrzebę sprawdzania różnych tabel, stosowanie UNION i innych kombinacji, bo masz wszystko w jednej. Poza tym zauważ, że user i nauczyciel o tym samym id jak zostaną rozpoznani przez system? Osobne panele logowania, z których jeden sprawdza tylko uczniów, a inny tylko nauczycieli lub dodatkowy checkbox/radio "Jestem nauczycielem/Jestem uczniem"? winksmiley.jpg
piotrdd2
skoro posiadasz 2 takie same tabele nie lepiej zrobić jedna, a dodać do niej pole "user_typ"
i przypisać odpowiednio 1 - uczeń, 2 - nauczyciel?

  1. CREATE TABLE `user` (
  2. `user_id` tinyint(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `user_name` varchar(13) NOT NULL,
  4. `user_password` varchar(40) NOT NULL,
  5. `user_typ` int(1) NOT NULL,
  6. PRIMARY KEY (`user_id`)
  7. )



  1. SELECT user_typ FROM user WHERE user_name = 'testtest' AND user_password= '12345678'


powyższe zapytanie zwróci 1 bądź 2... i po kłopocie.

a odnośnie "count" co ty chcesz zliczyć?
agentmullder
Rozumiem was. Tylko moze zle podalem tabele, troche je uproscilem. W tabeli nauczyciele bedzie zalozmy o 5 kolumn wiecej np:
- pensja
- stanowisko
- staz
- stawka za nadgodziny
- ...

Zas w tabeli uczniowie oprocz tego co wczesniej podalem teoretycznie nie bedzie nic wiecej. Zatem jesli wrzucimy oba typy uzytkownikow do jednej tabeli, bedziemy mieli z 12 kolumn, z czego dla uzytkownikow (okolo 500 uczniow) typu uczen wykorzystamy tylko z 3 kolumny a dla nauczycieli (okolo 10 nauczycieli) typy nauczyciel az blisko 9 kolumn. A taki sposob wydaje mi sie malo ekonomiczny z punktu widzenia wykorzystania tabel.

Countem chce sprawdzic czy podany login i haslo znajduje sie w ktorejs tabeli.
piotrdd2
no to dołóż teraz tabele z tymi dodatkowymi danymi,



- pensja
- stanowisko
- staz
- stawka za nadgodziny
i oczywiście pole "user_id" które stworzy relacje z polem "user_id" z tabeli "user"
agentmullder
Cytat(piotrdd2 @ 15.03.2010, 13:08:11 ) *
no to dołóż teraz tabele z tymi dodatkowymi danymi,



- pensja
- stanowisko
- staz
- stawka za nadgodziny
i oczywiście pole "user_id" które stworzy relacje z polem "user_id" z tabeli "user"



Uzupelnilem to w pierwszym poscie.
piotrdd2
ja bym to zrobił tak:
  1. CREATE TABLE `user` (
  2. `user_id` tinyint(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `user_name` varchar(13) NOT NULL,
  4. `user_password` varchar(40) NOT NULL,
  5. PRIMARY KEY (`user_id`)
  6. )


  1. CREATE TABLE `nauczyciele` (
  2. `user_id` tinyint(10) UNSIGNED NOT NULL,
  3. `user_stanowisko` varchar(13) NOT NULL,
  4. `user_staz` int(13) NOT NULL,
  5. `user_pensja` float(13) NOT NULL,
  6. `user_stawka` float(13) NOT NULL,
  7. `user_wiek` int(13) NOT NULL,
  8. PRIMARY KEY (`user_id`)
  9. )



  1. INSERT INTO `user` (`user_id`, `user_name`, `user_password`) VALUES ('1','testtest','12345678');
  2. INSERT INTO `nauczyciele` (`user_id`, `user_stanowisko`,`user_staz`,`user_pensja`,`user_stawka`,`user_wiek`) VALUES ('1','Matematyk','3','1200','50','40');


  1. SELECT user_id FROM user WHERE user_name = 'testtest' AND user_password= '12345678'

jeśli jest użytkownik w bazie to pokaże jego ID

a później to się bawić do woli...
agentmullder
Cytat(piotrdd2 @ 15.03.2010, 14:42:32 ) *
ja bym to zrobił tak:
  1. CREATE TABLE `user` (
  2. `user_id` tinyint(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `user_name` varchar(13) NOT NULL,
  4. `user_password` varchar(40) NOT NULL,
  5. PRIMARY KEY (`user_id`)
  6. )


  1. CREATE TABLE `nauczyciele` (
  2. `user_id` tinyint(10) UNSIGNED NOT NULL,
  3. `user_stanowisko` varchar(13) NOT NULL,
  4. `user_staz` int(13) NOT NULL,
  5. `user_pensja` float(13) NOT NULL,
  6. `user_stawka` float(13) NOT NULL,
  7. `user_wiek` int(13) NOT NULL,
  8. PRIMARY KEY (`user_id`)
  9. )



  1. INSERT INTO `user` (`user_id`, `user_name`, `user_password`) VALUES ('1','testtest','12345678');
  2. INSERT INTO `nauczyciele` (`user_id`, `user_stanowisko`,`user_staz`,`user_pensja`,`user_stawka`,`user_wiek`) VALUES ('1','Matematyk','3','1200','50','40');


  1. SELECT user_id FROM user WHERE user_name = 'testtest' AND user_password= '12345678'

jeśli jest użytkownik w bazie to pokaże jego ID

a później to się bawić do woli...


Tyle, ze wedlug Twojej propozycji, Nauczyciel juz sie nie zaloguje. Bo tworzysz tabele o nazwie user (zamiast uczniowie, ale to szczegol) i wyszukujesz uzytkownikow w tabeli uczniowie, a co z Nauczycielami? Wiem wiem nikt nie lubi nauczycieli, ale trzeba umozliwic im logowanie.

Problem nadal nie rozwiazany.
aio
nie wiem po co ten count, ale żeby działał count to przed średnikiem trzeba jakoś nazwać tabele dostarczana w nawiasach wg: SELECT COUNT(*) FROM (SELECT ....) A;

Każdy ma uwagi do struktury Twojej DB, to ja napomknę, że ponieważ tabele reprezentują różne instancje ich id nazwy też powinno się różnić: teacher_id, pupil_id; jak będziesz rozbudowywał db to później będziesz np przypisywał uczniów do nauczycieli albo coś w tym stylu albo jakieś bardziej skomplikowane relacje to będziesz szukał niepotrzebnie skomplikowanych rozwiązań i warunków.

Pozdrawiam
agentmullder
Cytat(aio @ 15.03.2010, 15:35:30 ) *
nie wiem po co ten count, ale żeby działał count to przed średnikiem trzeba jakoś nazwać tabele dostarczana w nawiasach wg: SELECT COUNT(*) FROM (SELECT ....) A;

Każdy ma uwagi do struktury Twojej DB, to ja napomknę, że ponieważ tabele reprezentują różne instancje ich id nazwy też powinno się różnić: teacher_id, pupil_id; jak będziesz rozbudowywał db to później będziesz np przypisywał uczniów do nauczycieli albo coś w tym stylu albo jakieś bardziej skomplikowane relacje to będziesz szukał niepotrzebnie skomplikowanych rozwiązań i warunków.

Pozdrawiam


Czyli rowniez uwazasz zeby wszystkich usersow uczniow i nauczycieli wrzucic do jednej tabeli? Mimo, ze np uczniowie beda uzywali tylko 3 kolumn a nauczyciele 9?

Jesli jeszcze ktos przyzna, zeby wrzucic wszystkich uzytkownikow do 1 tabeli to sie dam na spokoj z kombinowaniem i tak zrobie.
piotrdd2
Cytat(agentmullder @ 15.03.2010, 17:16:11 ) *
Tyle, ze wedlug Twojej propozycji, Nauczyciel juz sie nie zaloguje. Bo tworzysz tabele o nazwie user (zamiast uczniowie, ale to szczegol) i wyszukujesz uzytkownikow w tabeli uczniowie, a co z Nauczycielami? Wiem wiem nikt nie lubi nauczycieli, ale trzeba umozliwic im logowanie.

Problem nadal nie rozwiazany.


zaloguje, loginy i hasła uczniow i nauczycieli są w tej samej tabeli!, a jeśli dany user jest nauczycielem to dodatkowo pobiera dane z tabeli 'nauczyciele'
tam jest relacja u.user_id=n.user_id

Dodatkowo stwórz sobie pole 'user_typ' tak jak pisałem wcześniej dla ułatwienia.
aio
Cytat(agentmullder @ 15.03.2010, 15:42:26 ) *
Czyli rowniez uwazasz zeby wszystkich usersow uczniow i nauczycieli wrzucic do jednej tabeli? Mimo, ze np uczniowie beda uzywali tylko 3 kolumn a nauczyciele 9?

Jesli jeszcze ktos przyzna, zeby wrzucic wszystkich uzytkownikow do 1 tabeli to sie dam na spokoj z kombinowaniem i tak zrobie.


nie, aż tak głęboko się nie wgryzam co chcesz zrobić. Po prostu powierzchownie patrząc widzę dwie table, z prawdopodobnie dwoma indexami niezależnymi o tej samej nazwie user_id. Jeśli już to pewnie zrobiłbym 3 tabele: teacher, pupil, user. user mialby kolumny: 'czy teacher/pupil', login, pass, i inne wspólne charakterystyczne dla dostępu via internet. Nie wiem nie wgryzam się, sam musisz ocenić jak będziesz później to rozwijał.
agentmullder
Mam w obu tabelach user_rangnge i na tej podstawie uzytkownicy maja dostaep do okreslonych podstron za pomoca sesji. Dla jednej tabeli skrypt dziala poprawnie, ale dla dwoch tabel z select count(*) from (select ....) A; nie dziala :/ Gdyby ten count dzialal, to mialbym problem z glowy. Juz z tym borykam sie od miesiaca i nadal siedze w .. nie powiem gdzie ;/
aio
Cytat(agentmullder @ 15.03.2010, 16:35:53 ) *
Mam w obu tabelach user_rangnge i na tej podstawie uzytkownicy maja dostaep do okreslonych podstron za pomoca sesji. Dla jednej tabeli skrypt dziala poprawnie, ale dla dwoch tabel z select count(*) from (select ....) A; nie dziala :/ Gdyby ten count dzialal, to mialbym problem z glowy. Juz z tym borykam sie od miesiaca i nadal siedze w .. nie powiem gdzie ;/

to podaj zapytanie, ktore nie dziala
agentmullder
No wiec w php to wyglada tak:

  1. $zmienna="Select count(*) from (
  2. select user_name from users2 where user_name = '$log' and user_password= '$pass' UNION select name from users4 where name = '$log' and password= '$pass'
  3. ) A ";


$log to zmienna ktora przechowuje wpisany login z formularza;
$pass to zmienna ktora przechowuje haslo wpisane z formularza.
aio
Cytat(agentmullder @ 15.03.2010, 16:54:12 ) *
No wiec w php to wyglada tak:

  1. $zmienna="Select count(*) from (
  2. select user_name from users2 where user_name = '$log' and user_password= '$pass' UNION select name from users4 where name = '$log' and password= '$pass'
  3. ) A ";


$log to zmienna ktora przechowuje wpisany login z formularza;
$pass to zmienna ktora przechowuje haslo wpisane z formularza.


jak poprawisz nazwy kolumn to bedzie działało, name na user_name, etc
sprawdzaj sobie zapytania np. phpmyadmin - czesto o proste błedy a komunikat błędu szybko Cie naprowadzi gdzie błąd
agentmullder
  1. SELECT count(*) FROM (
  2. SELECT user_name FROM users2 WHERE user_name = '$log' AND user_password= '$pass' UNION SELECT user_name FROM users4 WHERE user_name = '$log' AND usser_password= '$pass') A;


Tak robilem jak mowisz w phpmyadminie. Tak tez mialem identyczne nazwy kolumn. Jaki efekt? A no taki, ze mimo ze wpisujac login i haslo w miejsa $log i $pass phpmyadmin wypluwal mi, ze sa poprawne dane mimo, ze w bazie nie bylo takiego loginu i hasla.

Pokaż rekordy 0 - 0 (1 wszystkich, Wykonanie zapytania trwało 0.0004 sekund(y))

Zawsze to samo mi dawalo, niezaleznie czy login i haslo byly w bazie czy nie.
aio
Cytat(agentmullder @ 15.03.2010, 17:10:17 ) *
  1. SELECT count(*) FROM (
  2. SELECT user_name FROM users2 WHERE user_name = '$log' AND user_password= '$pass' UNION SELECT user_name FROM users4 WHERE user_name = '$log' AND usser_password= '$pass') A;


Tak robilem jak mowisz w phpmyadminie. Tak tez mialem identyczne nazwy kolumn. Jaki efekt? A no taki, ze mimo ze wpisujac login i haslo w miejsa $log i $pass phpmyadmin wypluwal mi, ze sa poprawne dane mimo, ze w bazie nie bylo takiego loginu i hasla.

Pokaż rekordy 0 - 0 (1 wszystkich, Wykonanie zapytania trwało 0.0004 sekund(y))

Zawsze to samo mi dawalo, niezaleznie czy login i haslo byly w bazie czy nie.


e tam, coś kręcisz. Zapytanie zwraca poprawnie 0 dla braku usera lub 1 gdy jest. Masz pewnie błąd gdzieś w php, może źle interpretujesz wynik zapytania?
agentmullder
@aio masz ode mnie mega +! Dziekuje za pomoc. Problem rozwiazany smile.gif
DarKhangel
Jak chcesz zliczyć to wystarczy najprościej użyć
  1. SELECT count(user_name) AS count FROM uczniowie WHERE user_name = 'testtest' AND user_password= '12345678' UNION SELECT user_name FROM nauczyciele WHERE user_name = 'xxxx' AND user_password= 'xxxxxx';
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.