Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Szukanie pozczegolnego znaku w MySQL
Arhimenrius
post 24.05.2012, 10:34:04
Post #1





Grupa: Zarejestrowani
Postów: 115
Pomógł: 3
Dołączył: 19.04.2011

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


Witam. Mam takie oto zapytanie do MySQL:
  1. $klasa = $db -> prepare("SELECT `clname`, `$data2` FROM `class");


I tutaj jest moje pytanie. Ponieważ pole 'clname' ma dane zapisane w formacie typu: 1IB, 3EN (tak jak to klasy szkolne). natomiast pole gdzie jest $data2, jest to statystyka, w sensie są tam jakieś punkty. I teraz takie moje pytanie. Jak zmodyfikować owe zapytanie, by pobierało np. wszystkie klasy pierwsze, oraz sumowało ich statystyke? (teo $data2, który np. przyjmuje wartość 'firsthalf').

Edit: Wiem że mógłbym to zrobić za pomocą LIKE, aczkolwiek wiem też iż jest ona niewydajna i w miarę możliwości chciałbym jej uniknąć.

Ten post edytował Arhimenrius 24.05.2012, 10:40:01
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 15)
d3ut3r
post 24.05.2012, 10:41:04
Post #2





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

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


Jeżeli dobrze zrozumiałem to powinno zadziałać smile.gif

  1. SELECT `clname`,SUM(`inna_kolumna`) AS suma FROM `class` WHERE `clname` LIKE '1%';


//edit

Gorzej jeżeli masz więcej niż 10 klas, wówczas warunek '1%' będą spełniały klasy '11B','12AIF' itd.

Ten post edytował d3ut3r 24.05.2012, 10:42:25


--------------------
http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
Go to the top of the page
+Quote Post
Arhimenrius
post 24.05.2012, 14:11:11
Post #3





Grupa: Zarejestrowani
Postów: 115
Pomógł: 3
Dołączył: 19.04.2011

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


12AF nie jest możliwe, no, są to klasy szkolne, czyli od 1 do 4 wink.gif więcej jest wykluczone (zakładam iż ową aplikację będą używały osoby znające się na fachu bycia bibliotekarzem).

Tak wygląda po zmodyfikowaniu.

  1. $klasa = $db -> prepare("SELECT `clname`,SUM(`$data2`) AS suma FROM `class` WHERE `clname` LIKE '1%' ");




Jednak jest problem, ponieważ wyrzuca mi takowy błąd:

Cytat
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 1140 Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause' in


Pierwszy raz mam tego typu error, przez co nie mam pojęcia co zrobić i jak zareagować.

Ten post edytował Arhimenrius 24.05.2012, 14:11:53
Go to the top of the page
+Quote Post
d3ut3r
post 24.05.2012, 14:14:26
Post #4





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

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


jak wygląda tabela class i zapytanie z podstawioną wartością zamiast zmiennej ?


--------------------
http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
Go to the top of the page
+Quote Post
Arhimenrius
post 24.05.2012, 14:18:55
Post #5





Grupa: Zarejestrowani
Postów: 115
Pomógł: 3
Dołączył: 19.04.2011

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


clid int(8) UNSIGNED Nie auto_increment
clname varchar(20) utf8_general_ci Nie
rank_september int(8) UNSIGNED Nie 0
rank_october int(8) UNSIGNED Nie 0
rank_november int(8) UNSIGNED Nie 0
rank_december int(8) UNSIGNED Nie 0
rank_january int(8) UNSIGNED Nie 0
rank_february int(8) UNSIGNED Nie 0
rank_march int(8) UNSIGNED Nie 0
rank_april int(8) UNSIGNED Nie 0
rank_may int(8) UNSIGNED Nie 0
rank_june int(8) UNSIGNED Nie 0
firsthalf int(11) UNSIGNED Nie 0
secondhalf int(11) UNSIGNED Nie 0
stat_year int(11) UNSIGNED Nie 0
rank_today tinyint(4)

Tak wygląda tabela Class

$klasa = $db -> prepare("SELECT `clname`,SUM(`secondhalf`) AS suma FROM `class` WHERE `clname` LIKE '1%' ");

a tak zapytanie

Ten post edytował Arhimenrius 24.05.2012, 14:19:07
Go to the top of the page
+Quote Post
nospor
post 24.05.2012, 14:26:57
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Czemu nie czytacie komunikatu błędu? Obydwoje.
Czemu nie zajrzycie w google/manual? Obydwoje.

PRzecież to jest 10 sekund roboty....
http://dev.mysql.com/doc/refman/5.1/en/ser...y_full_group_by


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
d3ut3r
post 24.05.2012, 14:28:41
Post #7





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

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


coś takiego powinno zadziałać

  1. SELECT `clname`,SUM(`secondhalf`) AS suma FROM `class` WHERE `clname` LIKE '1%' GROUP BY clname


@nospor
nie krzycz smile.gif potrzebowałem czasu na przetestowanie, żeby znów gafy nie strzelić smile.gif

Ten post edytował d3ut3r 24.05.2012, 14:29:57


--------------------
http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
Go to the top of the page
+Quote Post
Arhimenrius
post 24.05.2012, 14:34:59
Post #8





Grupa: Zarejestrowani
Postów: 115
Pomógł: 3
Dołączył: 19.04.2011

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


  1. for($i=1;$i<10;$i++)
  2. {
  3. // SELECT `clname`,SUM(`inna_kolumna`) AS suma FROM `class` WHERE `clname` LIKE '1%';
  4. $klasa = $db -> prepare("SELECT `clname`,SUM(`$data2`) AS suma FROM `class` WHERE `clname` LIKE '1%' GROUP BY clname");
  5. $klasa -> execute();
  6. $daj = $klasa -> fetch(PDO::FETCH_ASSOC);
  7. var_dump($daj);
  8. //$ileosob = $db -> query("SELECT COUNT(*) FROM `users` WHERE `usclass` LIKE '$i%'");
  9. echo $daj['suma'];
  10. }


Zwraca piękne: bool(false) bool(false) bool(false) bool(false) bool(false) bool(false) bool(false) bool(false) bool(false)
Go to the top of the page
+Quote Post
d3ut3r
post 24.05.2012, 14:47:57
Post #9





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

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


teraz to już średnio rozumiem smile.gif

mój przykład odnosił się do testów na takie tabeli i danych:
  1.  
  2. CREATE TABLE IF NOT EXISTS `class` (
  3. `clname` varchar(20) NOT NULL,
  4. `secondhalf` int(11) NOT NULL,
  5. `clid` int(11) NOT NULL AUTO_INCREMENT,
  6. PRIMARY KEY (`clid`)
  7. );
  8.  
  9. INSERT INTO `class` (`clname`, `secondhalf`, `clid`) VALUES
  10. ('1b', 10, 1),
  11. ('2b', 12, 2),
  12. ('1e', 5, 3),
  13. ('4e', 2, 4),
  14. ('1ef', 3, 5),
  15. ('2b', 12, 6),
  16. ('1a', 12, 7),
  17. ('1c', 13, 8),
  18. ('3a', 5, 9),
  19. ('1ne', 10, 10),
  20. ('1b', 10, 11);
  21.  


zapytanie:
  1. SELECT `clname`,SUM(`secondhalf`) AS suma FROM `class` WHERE `clname` LIKE '1%' GROUP BY clname


zwraca:
Kod
clname|suma
1a         12
1b          20
1c         13
1e         5
1ef         3
1ne         10


kod php
  1. $st=$pdo->prepare("SELECT `clname` , SUM( `secondhalf` ) AS suma FROM `class` WHERE `clname` LIKE '1%' GROUP BY clname");
  2. $st->execute();
  3. $data=$st->fetchAll(PDO::FETCH_ASSOC);
  4. print_r($data);
  5.  
  6. /*
  7. To zwróci:
  8. Array
  9. (
  10.   [0] => Array
  11.   (
  12.   [clname] => 1a
  13.   [suma] => 12
  14.   )
  15.  
  16.   [1] => Array
  17.   (
  18.   [clname] => 1b
  19.   [suma] => 20
  20.   )
  21.  
  22.   [2] => Array
  23.   (
  24.   [clname] => 1c
  25.   [suma] => 13
  26.   )
  27.  
  28.   [3] => Array
  29.   (
  30.   [clname] => 1e
  31.   [suma] => 5
  32.   )
  33.  
  34.   [4] => Array
  35.   (
  36.   [clname] => 1ef
  37.   [suma] => 3
  38.   )
  39.  
  40.   [5] => Array
  41.   (
  42.   [clname] => 1ne
  43.   [suma] => 10
  44.   )
  45.  
  46. )
  47. */


Ten post edytował d3ut3r 24.05.2012, 14:48:49


--------------------
http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
Go to the top of the page
+Quote Post
Arhimenrius
post 24.05.2012, 14:54:01
Post #10





Grupa: Zarejestrowani
Postów: 115
Pomógł: 3
Dołączył: 19.04.2011

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


  1. CREATE TABLE `class` (
  2. `clid` int(8) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `clname` varchar(20) NOT NULL,
  4. `rank_september` int(8) UNSIGNED NOT NULL DEFAULT '0',
  5. `rank_october` int(8) UNSIGNED NOT NULL DEFAULT '0',
  6. `rank_november` int(8) UNSIGNED NOT NULL DEFAULT '0',
  7. `rank_december` int(8) UNSIGNED NOT NULL DEFAULT '0',
  8. `rank_january` int(8) UNSIGNED NOT NULL DEFAULT '0',
  9. `rank_february` int(8) UNSIGNED NOT NULL DEFAULT '0',
  10. `rank_march` int(8) UNSIGNED NOT NULL DEFAULT '0',
  11. `rank_april` int(8) UNSIGNED NOT NULL DEFAULT '0',
  12. `rank_may` int(8) UNSIGNED NOT NULL DEFAULT '0',
  13. `rank_june` int(8) UNSIGNED NOT NULL DEFAULT '0',
  14. `firsthalf` int(11) UNSIGNED NOT NULL DEFAULT '0',
  15. `secondhalf` int(11) UNSIGNED NOT NULL DEFAULT '0',
  16. `stat_year` int(11) UNSIGNED NOT NULL DEFAULT '0',
  17. `rank_today` tinyint(4) NOT NULL,
  18. PRIMARY KEY (`clid`)
  19. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
  20.  
  21. --
  22. -- Zrzut danych tabeli `class`
  23. --
  24.  
  25. INSERT INTO `class` VALUES (1, '3IB', 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 6, 6, 6);
  26. INSERT INTO `class` VALUES (2, '2A', 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 4, 4, 4);
  27.  


Tak wygląda baza danych.
Co do kodu:
  1. for($i=1;$i<10;$i++) //pętla(za dawnych czasów było 8 klas, więc lepiej zastosować 9, tak ejst w aplikacji w mojej szkole <<na niej się wzoruję>>
  2. {
  3. // SELECT `clname`,SUM(`inna_kolumna`) AS suma FROM `class` WHERE `clname` LIKE '1%';//chce wczytac klase (a pętla <<$i>> zwieksza klase o 1.
  4. $klasa = $db -> prepare("SELECT `clname`,SUM(`$data2`) AS suma FROM `class` WHERE `clname` LIKE '1%' GROUP BY clname");
  5. $klasa -> execute();//tutaj chce sprawdzic ilu jest uczniów w klasach o tym poziomie (potrzebne do obliczania średniej, nie ważne póki co, z tym dam rady).
  6. $daj = $klasa -> fetch(PDO::FETCH_ASSOC);
  7. var_dump($daj);//i standardowo wypisanie
  8. //$ileosob = $db -> query("SELECT COUNT(*) FROM `users` WHERE `usclass` LIKE '$i%'");
  9. echo $daj['suma'];
  10. }


Chodzi o to że potem mam otrzymać tabelkę:
Poziom klasy | ilosc wypozyczonych | srednia na ucznia
1 | ilosc | ilosc
2 | ilosc | ilosc
3 | ilosc | ilosc
itd

Ten post edytował Arhimenrius 24.05.2012, 14:56:27
Go to the top of the page
+Quote Post
d3ut3r
post 24.05.2012, 15:00:58
Post #11





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

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


2 rzeczy

1. Dodaj jakąś klasę pierwszą smile.gif
2. Po co to zapytanie w pętli ? 10 razy wykonujesz to samo.


--------------------
http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
Go to the top of the page
+Quote Post
Arhimenrius
post 25.05.2012, 09:36:47
Post #12





Grupa: Zarejestrowani
Postów: 115
Pomógł: 3
Dołączył: 19.04.2011

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


ponieważ potrzebuję wykonać to do wszystkich poziomów klas, a zakładam że nie tylko dla technikum to będzie ale też dla podstawówki, a nie wiadomo jak się zmieni edukacja wink.gif chyba że masz jakąś inną propozycję jak to zrobić.

Zastosowałem to $i, by dla każdej klasy zliczało, już ładnie wyrzuca:
  1. bool(false) array(2) { ["clname"]=> string(2) "2A" ["suma"]=> string(1) "0" } 0array(2) { ["clname"]=> string(3) "3IB" ["suma"]=> string(1) "0" } 0bool(false) bool(false) bool(false) bool(false) bool(false) bool(false)


EDIT:
To jednak dalej nie działa poprawnie. Stworzyłem sobie drugą klasę drugą i przy zapytaniu:
  1. SELECT `clname` , SUM( `secondhalf` ) AS `suma`
  2. FROM `class`
  3. WHERE `clname` LIKE '2%'
  4. GROUP BY `clname`


wychodzi w MySQL:
Cytat
clname suma
2IA 4
2IB 3


a zależy mi wy wyszedł 1 rekord z sumą obu liczb ( w tym przypadku: 7)

Ten post edytował Arhimenrius 25.05.2012, 09:39:54
Go to the top of the page
+Quote Post
d3ut3r
post 25.05.2012, 10:01:46
Post #13





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

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


to w takim razie w ogóle Cię nie zrozumiałem ....

czyli jeszcze raz zapytanie:

  1. SELECT SUM(secondhalf) AS suma FROM `class` WHERE `clname` LIKE '4%'


wyświetli Ci sumę kolumny secondhalf dla wszystkich klas zaczynających się od 4 jeżeli to o to Ci chodziło to nie potrzeba, żadnego grupowania itp.


--------------------
http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
Go to the top of the page
+Quote Post
Arhimenrius
post 25.05.2012, 10:05:01
Post #14





Grupa: Zarejestrowani
Postów: 115
Pomógł: 3
Dołączył: 19.04.2011

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


Właśnie nie chcę by wypisywało wszystkie 4 klasy.
Potrzebuję by zamiast:
3IA - 8
3IB - 9
itd...

Wyszło:

3 - 17

Czy coś w tym stylu. Ma mi wynik wszystkich klas 3 złączyć do 1 pola które wypiszę.
Go to the top of the page
+Quote Post
d3ut3r
post 25.05.2012, 10:09:33
Post #15





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

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


czyli dla tych danych:
  1. INSERT INTO `class` (`clname`, `secondhalf`, `clid`) VALUES
  2. ('1b', 10, 1),
  3. ('2b', 12, 2),
  4. ('1e', 5, 3),
  5. ('4e', 2, 4),
  6. ('1ef', 3, 5),
  7. ('2b', 12, 6),
  8. ('1a', 12, 7),
  9. ('1c', 13, 8),
  10. ('3a', 5, 9),
  11. ('1ne', 10, 10),
  12. ('1b', 10, 11);


zapytanie
  1. SELECT SUM(secondhalf) AS suma FROM `class` WHERE `clname` LIKE '2%'


zwróci 24 (mamy dwie klasy drugie każda ma secondhalf=12 czyli suma to 24) o to chodziło ?


--------------------
http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
Go to the top of the page
+Quote Post
Arhimenrius
post 25.05.2012, 10:12:02
Post #16





Grupa: Zarejestrowani
Postów: 115
Pomógł: 3
Dołączył: 19.04.2011

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


dokładnie smile.gif dzięki wielkie, w końcu to chodzi tak jak ma smile.gif
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: 18.07.2025 - 04:39