Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] suma x
Forum PHP.pl > Forum > Przedszkole
dentopolis
chciałbym poznać ile razy w wierszu tabeli występuje np.litera x lub c lub w.
czyli uzyskać np.6

obecnie mam taki kod:
  1. SELECT SUM('18'='w'+'17'='w'+'16'='w'+'15'='w'+'14'='w'+'13'='w'+'12'='w'+'11'='w'+'21'='w'+'22'='w'+'23'='w'+'24'='w'+'25'='w'+'26'='w'+'27'='w'+'28'='w'+'48'='w'+'47'='w'+'46'='w'+'45'='w'+'44'='w'+'44'='w'+'43'='w'+'42'='w'+'41'='w'+'31'='w'+'32'='w'+'33'='w'+'34'='w'+'35'='w'+'36'='w'+'37'='w'+'38'='w') AS liczbaw FROM badania WHERE pacjent=$id


trueblue
Nazw kolumn nie umieszcza się w pojedynczych apostrofach.
dentopolis
okay zmieniłem ale wynik się nie zmienił

  1. SELECT SUM(18='w'+17='w'+16='w'+15='w'+14='w'+13='w'+12='w'+11='w'+21='w'+22='w'+23='w'+24='w'+25='w'+26='w'+27='w'+28='w'+48='w'+47='w'+46='w'+45='w'+44='w'+44='w'+43='w'+42='w'+41='w'+31='w'+32='w'+33='w'+34='w'+35='w'+36='w'+37='w'+38='w') AS liczbaw FROM badania
trueblue
Nie uważasz, że 18='w', to będzie po prostu porównanie liczby 18 do stringu 'w'?
dentopolis
więc jak proponujesz?
phpion
Zacząłbym od poprawnej struktury danych tj. wydzielenia tych śmiesznych kolumn do osobnej tabeli, gdzie miałbyś 3 kolumny: id_badania, ta_dziwna_kolumna, wartość. Wtedy zadanie staje sie trywialne.
dentopolis
numery 48,47...to numery zębów a litery to stany zębów (x=brak, c-próchnica;w-wypełnienie)
Lord
Cytat(phpion @ 15.03.2017, 00:10:20 ) *
Zacząłbym od poprawnej struktury danych tj. wydzielenia tych śmiesznych kolumn do osobnej tabeli, gdzie miałbyś 3 kolumny: id_badania, ta_dziwna_kolumna, wartość. Wtedy zadanie staje sie trywialne.



Cytat(dentopolis @ 15.03.2017, 00:21:33 ) *
numery 48,47...to numery zębów a litery to stany zębów (x=brak, c-próchnica;w-wypełnienie)

Zrób jak ci kolega powiedział to bedzie łatwe wtedy :]

select sum('id') form zeby where id_badania = X and id_pacjenta = Y and stan = "w" i pewnie jeszcze ostatnia data czy co tam ci potrzebne
dentopolis
ale "stan" muszę przypisać do 36 zębów (kolumn). jest inna opcja?
phpion
Cytat(dentopolis @ 15.03.2017, 00:09:45 ) *
ale "stan" muszę przypisać do 36 zębów (kolumn). jest inna opcja?

Nie kolumn, a wierszy i to u siebie powinieneś poprawić.
dentopolis
próbuję to zrobić w php w ten sposób:

  1. if ($row['47'] == 'w') {
  2. $rightuppersevenw=1;
  3. }
  4. else {
  5.  
  6. }
  7. if ($row['48'] == 'w') {
  8. $rightuppereightw=1;
  9. }
  10. else {
  11.  
  12. }


ale potem gdy próbuję to dodać to mam 0:

$liczbaw=$rightuppersevenw+$rightuppereightw;




z kolei jeśli zamienię operator == na = to liczy mi także komórki z wartościami innymi niż w np.'c'
borabora
wygodniej zapytaniem. zmień strukturę tabeli tak jak mówił phpion id_badania, numer_zeba, stan.

  1. SELECT stan, count(1) AS ile FROM tabela WHERE id_badania=5 GROUP BY stan

wyjdzie ile wypełnien, próchnicy, braków

ps. to coś komercyjneo?
dentopolis
to skrypt do mojego gabinetu. czyli baza ma wyglądać tak?
id 18 x
id 17 c
id 16 c
id 15 w
itd?
jeszcze po id kolumna idpacjenta
Lord
1 tabela
id_pacjenta, nazwisko .... inne dane
2 tabela
id_badania, id_pacjenta, data_badania ..... inne dane
3 tabela
id, id_pacjenta, id_badania, nr_zeba, stan

cos takiego i wtedy masz duzo prościej pobrac te dane co sa ci potrzebne
viking
W 3 tabeli id_pacjenta jest już podane 2 tabeli po której wiążesz. Pamiętaj też że w mysql masz pole enum które mogłoby pasować do przechowywania stanu.
dentopolis
tylko że przy takim rozwiązaniu przy każdym badaniu będzie trzeba zapisać do bazy 36 wersów zamiast 1

a co jest nie tak w poście nr 12?
viking
Witaj w świecie relacyjnych baz danych smile.gif Tak się to robi. I przykładowo mógłbyś teraz zapisywać dodatkowe informacje do każdego zęba. Niemożliwe przy oryginalnym kodzie.
dentopolis
okay, zrobiłem jak opisaliście, ale jak teraz przypisać wartość komórki do zmiennej żeby uzyskać:
$rightuppereight = 'x';

Lord
$rightuppereight rozumiem ze to jest górna prawa 8 to pewnie to jest jakis numerek w bazie np 18 czy cos ? kolejna sprawa to wydaje mi sie ze nie powinno byc tam pacjant, a idb bo tak to bedziesz mial tylko ostatni/aktualny stan pacjenta, a nie wyniki poprzednich badan.

kolejna sprawa czemu chcesz zapisac to w formie $rightuppereight a nie w jako tabele aktualnego stanu
$ostatniebadanie['id_zeba'] = x

mozesz wtedy pobrac dane:

  1. SELECT stan,zab FROM zeby WHERE pacjent = 24;


i potem masz
  1. foreach($wynik as $v){
  2. $ostatniebadanie[$v['zab']] = $v['stan'];
  3. }
dentopolis
dzięki Lord za pomoc,ale czy mógłbym Cię prosić o podanie jak to ugryźć tym sposobem który mam obecnie? tzn
jak wrzucić dane do zmiennych (odpowiadają numerom zębów):
$rightuppereight = 'x';
$rightupperseven = 'c';
itd
viking
W ostateczności możesz ponownie przepisać tablicę którą podal lord. Tylko po co? Możesz napisać więcej co chcesz osiągnąć? To jakieś wyświetlanie czy może przeliczanie wartości?
dentopolis
chciałbym w komórkach tabeli (pierwszym wierszu) wypisać stan zęba (x,c lub w).domyślnie pole ma być puste i wtedy wyświetla się ząb biały.gdy wartość jest x obrazka nie ma (brak zęba), gdy c-obrazek jest czerwony (do leczenia), gdy w-obrazek jest zielony (wypełnienie).
oprócz tego chcę potem policzyć ile jest usuniętych ile do leczenia, ile wypełnionych.

wcześniej potrafiłem wypisać wartości (stany zębów) mając dane w jednym wersie, ale nie potrafiłem ich sumować. a teraz odwrotnie.

viking
Kod który podał Ci Lord dokładnie robi to co chcesz. Iteruje po wszystkich zębach danego pacjenta. Możesz teraz stworzyć dodatkowe zmienne przed pętla i później warunkami if ($v[´stan´] === 'x') zwiększ licznik itd.
dentopolis
okay, ale jak ten kod powinien wyglądać? chociaż jeden przykład byłby pomocny:

  1. $sqldiagram = "SELECT stan,zab FROM badania WHERE pacjent=$id";
  2. $resultdiagram = $conn->query($sqldiagram);
  3.  
  4.  
  5. if ($resultdiagram->num_rows > 0) {
  6.  
  7. while($row = $resultdiagram->fetch_assoc()) {
  8.  
  9.  
  10. }
  11.  




wyświetlanie obrazków:
  1. $tablica = explode(" ",$rightupperseven);
  2.  
  3. $obrazki = "";
  4. for ($i=0;$i<count($tablica);$i++){
  5.  
  6. switch ($tablica[$i]) {
  7. case 'x':
  8. $obrazki = $obrazki."";
  9. break;
  10.  
  11. case 'c':
  12. $obrazki = $obrazki."<img src='gfx/c.png' style='width:50px;'>";
  13. break;
  14.  
  15. case 'w':
  16. $obrazki = $obrazki."<img src='gfx/w.png' style='width:50px;'>";
  17. break;
  18.  
  19. case 'o':
  20. $obrazki = $obrazki."<img src='gfx/o.png' style='width:50px;'>";
  21. break;
  22.  
  23. default:
  24. $obrazki = $obrazki."<img src='gfx/tooth.png' width='50px'>" ;
  25. break;
  26. }
  27. }
Lord
Cytat(dentopolis @ 15.03.2017, 20:31:14 ) *
okay, ale jak ten kod powinien wyglądać? chociaż jeden przykład byłby pomocny:

  1. $sqldiagram = "SELECT stan,zab FROM badania WHERE pacjent=$id";
  2. $resultdiagram = $conn->query($sqldiagram);
  3.  
  4.  
  5. if ($resultdiagram->num_rows > 0) {
  6. $obrazki = "";
  7. while($row = $resultdiagram->fetch_assoc()) {
  8. switch ($row['stan']) {
  9. case 'x':
  10. $obrazki = $obrazki."";
  11. break;
  12.  
  13. case 'c':
  14. $obrazki = $obrazki."<img src='gfx/c.png' style='width:50px;'>";
  15. break;
  16.  
  17. case 'w':
  18. $obrazki = $obrazki."<img src='gfx/w.png' style='width:50px;'>";
  19. break;
  20.  
  21. case 'o':
  22. $obrazki = $obrazki."<img src='gfx/o.png' style='width:50px;'>";
  23. break;
  24.  
  25. default:
  26. $obrazki = $obrazki."<img src='gfx/tooth.png' width='50px'>" ;
  27. break;
  28. }
  29. }
  30.  
  31.  
  32.  
  33. }
  34.  

Takie zapis:
$obrazki .= "<img src='gfx/tooth.png' width='50px'>" ;
to to samo co:
$obrazki = $obrazki."<img src='gfx/tooth.png' width='50px'>" ;
dentopolis
nie wyświetla teraz obrazka

kod źródłowy
Lord
No to musisz szukac tongue.gif

ogólnie to cieżko ten kod sie przegląda wink.gif
Poczytaj trochę o warstwie prezentacji czy jak to sie tam zwie smile.gif

https://pl.wikibooks.org/wiki/PHP/Czym_jest...ablon%C3%B3w%3F
dentopolis
zrobiłem to po swojemu (małą wiedzą php),jest dużo zapytań do bazy ale działa.
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.