Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Szukanie pozczegolnego znaku w MySQL
Forum PHP.pl > Forum > Przedszkole
Arhimenrius
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ąć.
d3ut3r
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.
Arhimenrius
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ć.
d3ut3r
jak wygląda tabela class i zapytanie z podstawioną wartością zamiast zmiennej ?
Arhimenrius
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
nospor
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
d3ut3r
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
Arhimenrius
  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)
d3ut3r
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. */
Arhimenrius
  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
d3ut3r
2 rzeczy

1. Dodaj jakąś klasę pierwszą smile.gif
2. Po co to zapytanie w pętli ? 10 razy wykonujesz to samo.
Arhimenrius
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)
d3ut3r
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.
Arhimenrius
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ę.
d3ut3r
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 ?
Arhimenrius
dokładnie smile.gif dzięki wielkie, w końcu to chodzi tak jak ma smile.gif
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.