Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Problem z funkcja count
agentmullder
post 15.03.2010, 12:17:26
Post #1





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 1.03.2010

Ostrzeżenie: (0%)
-----


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?

Ten post edytował agentmullder 15.03.2010, 13:16:02
Go to the top of the page
+Quote Post
thek
post 15.03.2010, 12:52:23
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
piotrdd2
post 15.03.2010, 12:54:05
Post #3





Grupa: Zarejestrowani
Postów: 136
Pomógł: 2
Dołączył: 13.05.2003
Skąd: Przemyśl

Ostrzeżenie: (0%)
-----


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ć?
Go to the top of the page
+Quote Post
agentmullder
post 15.03.2010, 13:03:17
Post #4





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 1.03.2010

Ostrzeżenie: (0%)
-----


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.

Ten post edytował agentmullder 15.03.2010, 13:05:12
Go to the top of the page
+Quote Post
piotrdd2
post 15.03.2010, 13:08:11
Post #5





Grupa: Zarejestrowani
Postów: 136
Pomógł: 2
Dołączył: 13.05.2003
Skąd: Przemyśl

Ostrzeżenie: (0%)
-----


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"
Go to the top of the page
+Quote Post
agentmullder
post 15.03.2010, 13:54:00
Post #6





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 1.03.2010

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
piotrdd2
post 15.03.2010, 14:42:32
Post #7





Grupa: Zarejestrowani
Postów: 136
Pomógł: 2
Dołączył: 13.05.2003
Skąd: Przemyśl

Ostrzeżenie: (0%)
-----


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...

Ten post edytował piotrdd2 15.03.2010, 14:43:47
Go to the top of the page
+Quote Post
agentmullder
post 15.03.2010, 15:16:11
Post #8





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 1.03.2010

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
aio
post 15.03.2010, 15:35:30
Post #9





Grupa: Zarejestrowani
Postów: 28
Pomógł: 4
Dołączył: 13.11.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
agentmullder
post 15.03.2010, 15:42:26
Post #10





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 1.03.2010

Ostrzeżenie: (0%)
-----


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.

Ten post edytował agentmullder 15.03.2010, 15:52:30
Go to the top of the page
+Quote Post
piotrdd2
post 15.03.2010, 15:55:22
Post #11





Grupa: Zarejestrowani
Postów: 136
Pomógł: 2
Dołączył: 13.05.2003
Skąd: Przemyśl

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
aio
post 15.03.2010, 15:59:12
Post #12





Grupa: Zarejestrowani
Postów: 28
Pomógł: 4
Dołączył: 13.11.2009

Ostrzeżenie: (0%)
-----


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ł.
Go to the top of the page
+Quote Post
agentmullder
post 15.03.2010, 16:35:53
Post #13





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 1.03.2010

Ostrzeżenie: (0%)
-----


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 ;/

Ten post edytował agentmullder 15.03.2010, 16:37:28
Go to the top of the page
+Quote Post
aio
post 15.03.2010, 16:49:22
Post #14





Grupa: Zarejestrowani
Postów: 28
Pomógł: 4
Dołączył: 13.11.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
agentmullder
post 15.03.2010, 16:54:12
Post #15





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 1.03.2010

Ostrzeżenie: (0%)
-----


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.

Ten post edytował agentmullder 15.03.2010, 16:58:40
Go to the top of the page
+Quote Post
aio
post 15.03.2010, 17:02:13
Post #16





Grupa: Zarejestrowani
Postów: 28
Pomógł: 4
Dołączył: 13.11.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
agentmullder
post 15.03.2010, 17:10:17
Post #17





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 1.03.2010

Ostrzeżenie: (0%)
-----


  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.
Go to the top of the page
+Quote Post
aio
post 15.03.2010, 17:17:53
Post #18





Grupa: Zarejestrowani
Postów: 28
Pomógł: 4
Dołączył: 13.11.2009

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
agentmullder
post 15.03.2010, 17:24:18
Post #19





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 1.03.2010

Ostrzeżenie: (0%)
-----


@aio masz ode mnie mega +! Dziekuje za pomoc. Problem rozwiazany smile.gif

Ten post edytował agentmullder 15.03.2010, 18:34:21
Go to the top of the page
+Quote Post
DarKhangel
post 16.03.2010, 14:25:08
Post #20





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 20.11.2009

Ostrzeżenie: (0%)
-----


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';
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 06:45