Czy da się to zrobić za pomocą jednego zapytania

0

Mam takie pytanie jest sobie tabela substancje, która ma następujące pola
id nazwa cena rodzaj_porcji id_usera za_ile color id_rodzaju rownowaznik ile_procent
i tabela spozycie, która ma następujące pola
id porcja data opis_spozycia id_usera rodzaj_porcji kto_bedzie_ogladal id_substancji data2

i teraz jest tak, że są w tabeli substancje substancje, które mają równoważnik jakiś tam i dana porcja np jakaś substancja odpowiada równoważnikowi czyli mamy np substancje
substancja 1 x 10 mg odpowiada rownowaznikowi y 100 mg
substancja 2 x 20 mg odpowiada rownowaznikowi y 100 mg
substancja 3 x 15 mg odpowiada rownowaznikowi y 100 mg

i teraz wzór na obliczanie tego równoważnika jest taki
($dawka / $rownowaznik_x) * $rownowaznik_y

I teraz moje pytanie jest takie czy da się za pomocą jednego zapytania zwrócić ilość wszystkich substancji, które mają rownowaznik != 0.00 i w ciągu danego dnia zwrócić w formie rownowaznika y zakładając, że dzień zaczyna się o 5:00, a kończy o tej samej, czyli jeszcze raz
przykładowo w jakiś dzień braliśmy substancje 1 w dawce 20 mg i substancje 2 w dawce 10 mg to na ten dzień wynik będzie 250 mg

0

Daj na sqlfiddle przykład danych, a tu spodziewany wynik dla nich.

0

http://sqlfiddle.com/#!9/e8bfdc
substancja 1 x 10 mg odpowiada rownowaznikowi y 100 mg
substancja 2 x 20 mg odpowiada rownowaznikowi y 100 mg
substancja 3 x 15 mg odpowiada rownowaznikowi y 100 mg
przykładowo w jakiś dzień braliśmy substancje 1 w dawce 20 mg i substancje 2 w dawce 10 mg to na ten dzień wynik będzie 250 mg

1

Takie zapytanie

SELECT 
	spozycie.data2, 
	spozycie.id_usera, 
	sum(
		spozycie.porcja/(
			SELECT rownowaznik 
			FROM substancje 
			WHERE spozycie.id_substancji = substancje.id 
		)*100
	) AS 'spozycie [mg]' 
FROM spozycie 
GROUP BY spozycie.data2, spozycie.id_usera;

Takie dane i wynik:

substancje

screenshot-20171115184757.png

spozycie

screenshot-20171115184838.png

wynik

screenshot-20171115184855.png

Co do substancji to bez sensu jest ta kolumna id_usera. Tabela substancje ma zawierać tylko info o substancjach

2

Taki kod

SELECT
	(DATE(
		IF(HOUR(spozycie.data) > 5 , 
			spozycie.data, 
			DATE_ADD(spozycie.data,INTERVAL -1 DAY))
		)
	) AS dat,

	spozycie.id_usera, 

	SUM(
		spozycie.porcja/(
			SELECT rownowaznik 
			FROM substancje 
			WHERE spozycie.id_substancji = substancje.id 
		)*100
	) AS 'spozycie [mg]' 

FROM spozycie
GROUP BY dat, spozycie.id_usera

Takie dane i wynik:

spozycie

screenshot-20171115193328.png

wynik

screenshot-20171115193354.png

W tabeli substancje żadnych modyfikacji nie robiłem

1

spozycie.DATA powinno być z małej w sensie "spozycie.data", tylko ten znacznik sql tak to przerobił i nic na to nie poradzę

@Manuel.Artificer tam nie poradzisz:

SELECT (DATE(IF(HOUR(spozycie.data) >=5 , spozycie.data, DATE_ADD(spozycie.data,INTERVAL -1 DAY)))) AS dat, spozycie.id_usera, SUM(spozycie.porcja/(SELECT rownowaznik FROM substancje WHERE spozycie.id_substancji = substancje.id )*100) AS 'spozycie [mg]' FROM spozycie GROUP BY dat, spozycie.id_usera
0

nie wiem czy kiedyś zrozumiem ludzi co utrudniają sobie życie i zamiast rozdzielić zapytanie na kilka etapów tworząc po drodze tabele tymczasowe (lub korzystając z with) to chcą upchnąć wszystko do jednego.

2

@Julian_: ja za to nigdy nie zrozumiem ludzi, którzy myślą, że forum zastąpi im mózgi i liczą, że odpowiedź da im najoptymalniejsze rozwiązanie. Ty rozbijesz na kilka zapytań, ja zmienię na joina:

SELECT
    (DATE(
        IF(HOUR(spozycie.data) > 5 , 
            spozycie.data, 
            DATE_ADD(spozycie.data,INTERVAL -1 DAY))
        )
    ) AS dat,
 
    spozycie.id_usera, 
 
    SUM(
        spozycie.porcja/rownowaznik*100
    ) AS 'spozycie [mg]' 
 
FROM spozycie
inner join substancje on spozycie.id_substancji = substancje.id 
GROUP BY dat, spozycie.id_usera

Żadne z podanych w tym wątku rozwiązań nie korzysta z tabel tymczasowych...

0

Teraz chcę żeby mi zwróciło listę substancji gdzie były by tylko uwzględnione te substancje, które mają w równoważnik != '0.00' a to zapytanie zwraca mi wszystkie substancje

SELECT count(spozycie.data2), spozycie.data2, spozycie.id_usera, SUM( spozycie.porcja/ ( SELECT rownowaznik FROM substancje WHERE spozycie.id_substancji = substancje.id and substancje.rownowaznik != '0.00' and substancje.rownowaznik != null)*10 ) AS 'spozycie2' FROM spozycie GROUP by spozycie.data2 order by spozycie.data2 desc 

Próbowałem czegoś takiego, ale zwraca mi błąd.

SELECT  
 count(select data2 from spozycie  ) as 'tomi', 
spozycie.data2, spozycie.id_usera,  SUM( spozycie.porcja/ ( SELECT rownowaznik FROM substancje WHERE spozycie.id_substancji = substancje.id and substancje.rownowaznik != '0.00' and substancje.rownowaznik != null)*10 ) AS 'spozycie2' FROM spozycie GROUP by spozycie.data2 order by spozycie.data2 desc 
0
SELECT
    (DATE(
        IF(HOUR(spozycie.data) > 5 , 
            spozycie.data, 
            DATE_ADD(spozycie.data,INTERVAL -1 DAY))
        )
    ) AS dat,
 
    spozycie.id_usera, 
 
    SUM(
        spozycie.porcja/rownowaznik*100
    ) AS 'spozycie [mg]' 
 
FROM spozycie
inner join substancje on spozycie.id_substancji = substancje.id
WHERE substancje.rownowaznik != 0.00 AND substancje.rownowaznik IS NOT NULL
GROUP BY dat, spozycie.id_usera
0

Takie coś?

SELECT substancje.id, substancje.nazwa
FROM substancje
INNER JOIN spozycie on spozycie.id_substancji = substancje.id
WHERE rownowaznik != 0.00 AND rownowaznik IS NOT null
ORDER BY substancje.id

Zwraca Ci listę substancji z tabeli spożycie dla których równoważnik jest różny od 0 i nie jest nullem

chyba, że chodzi o to, że dla każdego usera ma być taka lista substancji?

1

Jak nie o to chodzi to napisz dokładnie, co chcesz uzyskać

SELECT 
	count(*) as liczba_uzytych_substancji,
	(DATE(
        IF(HOUR(spozycie.data) > 5 , 
            spozycie.data, 
            DATE_ADD(spozycie.data,INTERVAL -1 DAY))
        )
    ) AS dat
FROM substancje
INNER JOIN spozycie on spozycie.id_substancji = substancje.id
WHERE rownowaznik != 0.00 AND rownowaznik IS NOT null
GROUP BY dat
0

No to w takim razie zapytanie będzie wyglądało tak:

SELECT 
    count(DISTINCT substancje.id) as liczba_uzytych_substancji,
    (DATE(
        IF(HOUR(spozycie.data) > 5 , 
            spozycie.data, 
            DATE_ADD(spozycie.data,INTERVAL -1 DAY))
        )
    ) AS dat
FROM substancje
INNER JOIN spozycie on spozycie.id_substancji = substancje.id
WHERE rownowaznik != 0.00 AND rownowaznik IS NOT null
GROUP BY dat

1 użytkowników online, w tym zalogowanych: 0, gości: 1