dentopolis
14.03.2017, 19:51:19
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:
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
14.03.2017, 20:00:05
Nazw kolumn nie umieszcza się w pojedynczych apostrofach.
dentopolis
14.03.2017, 21:06:02
okay zmieniłem ale wynik się nie zmienił
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
14.03.2017, 21:10:28
Nie uważasz, że 18='w', to będzie po prostu porównanie liczby 18 do stringu 'w'?
dentopolis
14.03.2017, 21:48:32
więc jak proponujesz?
trueblue
14.03.2017, 22:02:49
phpion
14.03.2017, 22: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.
dentopolis
14.03.2017, 22: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)
Lord
14.03.2017, 23:17:15
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
15.03.2017, 00:09:45
ale "stan" muszę przypisać do 36 zębów (kolumn). jest inna opcja?
phpion
15.03.2017, 07:06:47
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
15.03.2017, 07:58:49
próbuję to zrobić w php w ten sposób:
if ($row['47'] == 'w') {
$rightuppersevenw=1;
}
else {
}
if ($row['48'] == 'w') {
$rightuppereightw=1;
}
else {
}
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
15.03.2017, 11:58:52
wygodniej zapytaniem. zmień strukturę tabeli tak jak mówił phpion id_badania, numer_zeba, stan.
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
15.03.2017, 12:53:07
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
15.03.2017, 14:25:16
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
15.03.2017, 14:40:58
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
15.03.2017, 15:12:04
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
15.03.2017, 15:14:41
Witaj w świecie relacyjnych baz danych

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
15.03.2017, 15:44:21
okay, zrobiłem jak opisaliście, ale jak teraz przypisać wartość komórki do zmiennej żeby uzyskać:
$rightuppereight = 'x';
Lord
15.03.2017, 16:24:10
$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:
SELECT stan,zab FROM zeby WHERE pacjent = 24;
i potem masz
foreach($wynik as $v){
$ostatniebadanie[$v['zab']] = $v['stan'];
}
dentopolis
15.03.2017, 17:11:17
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
15.03.2017, 17:36:09
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
15.03.2017, 17:51:53
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
15.03.2017, 18:11:44
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
15.03.2017, 18:31:14
okay, ale jak ten kod powinien wyglądać? chociaż jeden przykład byłby pomocny:
$sqldiagram = "SELECT stan,zab FROM badania WHERE pacjent=$id";
$resultdiagram = $conn->query($sqldiagram);
if ($resultdiagram->num_rows > 0) {
while($row = $resultdiagram->fetch_assoc()) {
}
wyświetlanie obrazków:
$tablica = explode(" ",$rightupperseven);
$obrazki = "";
for ($i=0;$i<count($tablica);$i++){
switch ($tablica[$i]) {
case 'x':
$obrazki = $obrazki."";
break;
case 'c':
$obrazki = $obrazki."<img src='gfx/c.png' style='width:50px;'>";
break;
case 'w':
$obrazki = $obrazki."<img src='gfx/w.png' style='width:50px;'>";
break;
case 'o':
$obrazki = $obrazki."<img src='gfx/o.png' style='width:50px;'>";
break;
default:
$obrazki = $obrazki."<img src='gfx/tooth.png' width='50px'>" ;
break;
}
}
Lord
15.03.2017, 18:44:05
Cytat(dentopolis @ 15.03.2017, 20:31:14 )

okay, ale jak ten kod powinien wyglądać? chociaż jeden przykład byłby pomocny:
$sqldiagram = "SELECT stan,zab FROM badania WHERE pacjent=$id";
$resultdiagram = $conn->query($sqldiagram);
if ($resultdiagram->num_rows > 0) {
$obrazki = "";
while($row = $resultdiagram->fetch_assoc()) {
switch ($row['stan']) {
case 'x':
$obrazki = $obrazki."";
break;
case 'c':
$obrazki = $obrazki."<img src='gfx/c.png' style='width:50px;'>";
break;
case 'w':
$obrazki = $obrazki."<img src='gfx/w.png' style='width:50px;'>";
break;
case 'o':
$obrazki = $obrazki."<img src='gfx/o.png' style='width:50px;'>";
break;
default:
$obrazki = $obrazki."<img src='gfx/tooth.png' width='50px'>" ;
break;
}
}
}
Takie zapis:
$obrazki .= "<img src='gfx/tooth.png' width='50px'>" ;
to to samo co:
$obrazki = $obrazki."<img src='gfx/tooth.png' width='50px'>" ;
dentopolis
15.03.2017, 18:58:11
nie wyświetla teraz obrazka
kod źródłowy
Lord
15.03.2017, 19:02:28
No to musisz szukac

ogólnie to cieżko ten kod sie przegląda

Poczytaj trochę o warstwie prezentacji czy jak to sie tam zwie
https://pl.wikibooks.org/wiki/PHP/Czym_jest...ablon%C3%B3w%3F
dentopolis
16.03.2017, 14:15:12
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.