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

0

Mam taki problem mam 4 tabele już pokazuje ich strukturę

tabela produkty

id 	nazwa 	id_users 	id_substancji 	color 	ile_procent 	rodzaj_porcji 	cena 	za_Ile

Tabela spozycie

id 	porcja 	id_users 	data 	id_produktu 	cena 	czy_dwa

Tabela substancje

id 	nazwa 	id_users 	id_grupy 	rownowaznik 	color

I tabela przekierowanie substancji


id 	id_substancji 	id_produktu

I teraz chodzi o to, żeby wybrać z tabeli spożycie np z określonego dnia np data1 2018-01-30 0400 data 2 2018-02-01 0400
I też chodzi o to, że np takie dane
jak są w tabeli

lek1(substancja1,substancja2) dawka 10 mg godz jakaś atam
lek2(substancja3)                   dawka 20 mg
lek3 (substancja3)                  dawka 10 mg
lek4(substancja4)                    dawka 15 mg
lek4(substancja4)                   dawka 20 mg 

I teraz chcę, żeby te dane znalazły się w takiej postaci
lek1 dawka 10 mg
substancja3 dawka 30 mg
substancja4 dawka 35 mg

Chodzi o to, że sumował powtarzające się produkty i je wypisał, ale wypisał substancja jaka w nich wchodzi natomiast jak produkt ma kilka substancji to, żeby wypisał nazwę produktu.

0

Bardzo ciężko zrozumieć Twój post i Twoje pytanie. Proszę napisz dokładnie jakie dane, z których kolumn, połączonych z którymi tabelami na wyjściu chciałbyś uzyskać.

PS: Ja po 2 minutach zastanawiania się, domyślam że chciałbyś pokazać które substancje się pokrywają w jakimś przedziale produktów? Strzał. Opisz dokładnie jakie chcesz wyjściowe dane.

0

Chodzi o to, że np są wyrzucane poszczególne substancje nazwa produktu czyli np apap nazwa substacji czynnej czyli np. paracetamol ale mogą się też zdarzyć leki które mają w sobie więcej niż jedna substancja czynna np antidol który zawiera kodeine i paracetamol i w tym całym procederze mogą się powtarzać produkty i to ma je zgrupować, ale mogą się też zdarzyć substancje które mają w swoim składzie ta samą substancje czynnną ale mają inną nazwę to w tym przypadku chce żeby wziął wszystkie wspólne produkty i wspólne substancje czynne i napisał że np paracetamolu wziąłem dzisiaj (float) a w przypadku kiedy produkt ma więcej niż jedną substancje czynną to żeby jak będzie wypisywał pogrupowane substancje to, żeby pogrupował na nazwie produktu nie po nazwie substancji czynnje.

2

Odpowiadam na pytanie - tak, da to się zrobić za pomocą jednego zapytania.

0

Zrobiłem to

public function wybierz_wszystkie_substancje($data1,$data2) {
  print $data2;
  //$wybierz_leki = DB::select("select sum(porcja) as porcja,data,spozycie.id as id,spozycie.cena as cena,produkty.id as id_produktu,substancje.id as id_substancji,produkty.rodzaj_porcji as rodzaj,produkty.color as color,produkty.nazwa as nazwa,substancje.nazwa as nazwa2 from spozycie  inner JOIN produkty on produkty.id = spozycie.id_produktu inner join substancje on produkty.id_substancji = substancje.id  where data < '$data2'  and data > '$data1' group by produkty.id_substancji order by data ");
  $wybierz_leki = DB::select ("select sum(porcja) as porcja,spozycie.id_produktu,produkty.nazwa,rodzaj_porcji as rodzaj,substancje.nazwa as nazwa2,produkty.id_substancji as id_substancji from spozycie, produkty,substancje,przekierowanie_substancji  where data < '$data2' and data > '$data1' and przekierowanie_substancji.id_substancji = substancje.id and spozycie.id_produktu = produkty.id group by id_produktu ");
  $tablica = array();
  $i = 0;
  $z = 0;
  $tablica_id = array();
  foreach ($wybierz_leki as $wybierze_leki2) {
  
  //   $wybierze_substancje = DB::select("select id_substancji as id_substancji,id_produktu,substancje.nazwa as substancje,substancje.color as kolor2 from przekierowanie_substancji inner join substancje on substancje.id = przekierowanie_substancji.id_substancji  where przekierowanie_substancji.id_produktu = '" . $wybierze_leki2->id_produktu . "'");
   $wybierze_substancje = DB::select("select id from substancje  where id = '" . $wybierze_leki2->id_substancji . "'");
     $wynik = "";
     $h = 0;
     
    foreach ($wybierze_substancje as $substancje2) {
      //$wynik .=  $substancje2->substancje;
      print "<font color=yellow>" . $substancje2->id . "</font>";
      //$z++;
      //$h++;
    }
    
   //print "<font color=red>" . $h . "</font>";
    //print "<font color=red>" . $wybierze_leki2->id_substancji . "</font>";
    if ($h ==  0) {
      $tablica[$i]['nazwa2'] = $wybierze_leki2->nazwa;
    }
    else {
	if ($h > 1) {
	  $tablica[$i]['nazwa2'] = $wybierze_leki2->nazwa;
	  //print "kupka";
	}
	else {
	  
	  $tablica[$i]['nazwa2'] = $wynik;
	}
    }
    
    switch($wybierze_leki2->rodzaj) {
      case 1:$tablica[$i]['rodzaj'] = "mg";
      break;
      case 2:$tablica[$i]['rodzaj'] = "mililitry";
      break;
      case 3:$tablica[$i]['rodzaj'] = "ilośći";
      break;
      default:$tablica[$i]['rodzaj'] = "mg";//207/208 baclofen 208
      
    }
    
    //$tablica[$i]['rodzaj'] = $wybierze_leki2->rodzaj;
    
    $tablica[$i]['porcja'] = $wybierze_leki2->porcja;
    print $tablica[$i]['nazwa2'] . "<br>";
    ///print $tablica[$i]['nazwa'] . "<br><br>";
    print $tablica[$i]['porcja'] . "<br>";
    $i++;
    
  }

  return $tablica;
  //print $z;
  //$tablica = $this->sumuj_powtarzajace_sie_rekordy($tablica);
  //foreach ($tablica as $tablica2) {
    //print $tablica2['nazwa2'] . "<br>";
    //print $tablica2['nazwa2'] . "<br>";
    //print $tablica2['porcja'] . "<br><br>";
  
  //}

}
0

Ja bym zaczął od tego, ze model danych wydaje się błędny..

Po co w produkcie IDSubstancji? Skoro jest to tylko 1 atrybut, a jak sam napisałeś w produkcie może być wiele substancji?

Czym jest "Przekierowanie substancji" ? Jest to jakiś termin farmaceutyczny?

Czym jest "Porcja" w "Spożyciu"? W jakich jednostkach jest wyrażona?

0
yarel napisał(a):

Ja bym zaczął od tego, ze model danych wydaje się błędny..

Po co w produkcie IDSubstancji? Skoro jest to tylko 1 atrybut, a jak sam napisałeś w produkcie może być wiele substancji?
No właśnie dlatego jest przekieroanie_substancji
Czym jest "Przekierowanie substancji" ? Jest to jakiś termin farmaceutyczny?
przekieroanie_substancji to jest to że id substancji należy id_produktu
i przykładowo id_produktu = 25//apa
i przykładowo id_substancji = 56 / paracetamol
id_substancji id_produktu
56 25
Czym jest "Porcja" w "Spożyciu"? W jakich jednostkach jest wyrażona?
porcja to jest dawka leku może być wyrażona w mg mililitracg albo sztuk.

0
Podaj tu w poscie oczekiwany wynik 
Mój oczekiwany wynik to 
Nazwa produktu nazwa substancji dawka ilość wystąpień
apap                  paracetamol         500         2
antidol              paracetamo,kodeina  150       2,2
thicodin             sulwalor,kodeina      150        1,2
lerivon                mianseryna             30         2 //i w  tym przypadku ma pokazać tylko mianserynę
deprexotel           mianseryna            30         2//i w  tym przypadku ma pokazać tylko mianserynę
0

@pol90, czy ty k#@wa normalny jesteś?
Pokaż mi gdzie w tym SQLFiddle występuje w danych "apap" bądź "paracetamol"...

0
pol90 napisał(a):

Czym jest "Przekierowanie substancji" ? Jest to jakiś termin farmaceutyczny?
przekieroanie_substancji to jest to że id substancji należy id_produktu

No to po co ID_Substancji na poziomie produktu, skoro jest w Przekierowaniu?

Czym jest "Porcja" w "Spożyciu"? W jakich jednostkach jest wyrażona?
porcja to jest dawka leku może być wyrażona w mg mililitracg albo sztuk.

No dobrze, to jak ktoś spożywa 10ml syropu ibum z ibuprofenem i 1 sztukę (kapsułkę) ibumu forte z ibuprofenem, to że niby czego się spodziewasz jako spożycia substancji w danym okresie? Kto ma wiedzieć w czym wyrażona jest ta dawka?

0
yarel napisał(a):
pol90 napisał(a):

Czym jest "Przekierowanie substancji" ? Jest to jakiś termin farmaceutyczny?
przekieroanie_substancji to jest to że id substancji należy id_produktu
To pole usunę
No to po co ID_Substancji na poziomie produktu, skoro jest w Przekierowaniu?

Czym jest "Porcja" w "Spożyciu"? W jakich jednostkach jest wyrażona?
porcja to jest dawka leku może być wyrażona w mg mililitracg albo sztuk.
porcja ma wartości 1 do 3 gdzie 1 to mg a 3 to sztuki
No dobrze, to jak ktoś spożywa 10ml syropu ibum z ibuprofenem i 1 sztukę (kapsułkę) ibumu forte z ibuprofenem, to że niby czego się spodziewasz jako spożycia substancji w danym okresie? Kto ma wiedzieć w czym wyrażona jest ta dawka?
na tym się nie zastanawiałem , ale wróćmy do tamtego.

0

To zapytanie było by dobre gdyby wszystkie susbtancje z danego dnia wypisywał jednak tego nie czyni

select sum(spozycie.porcja) as porcja,spozycie.id_produktu,produkty.nazwa,produkty.rodzaj_porcji as rodzaj_porcji,substancje.nazwa as nazwa2,produkty.id_substancji as id_substancji from spozycie inner join produkty on spozycie.id_produktu = produkty.id inner join substancje on substancje.id = produkty.id_substancji where data > '2018-03-22 05:00::00' and data <'2018-03-23 05:00:00' and spozycie.id_produktu = produkty.id group by produkty.id

Nie zapisuje leku sudafed.
Wniosek jest z tego taki jak dam tak

select sum(porcja) as porcja,data,spozycie.id as id,spozycie.cena as cena,produkty.id as id_produktu,produkty.rodzaj_porcji as rodzaj,produkty.color as color,produkty.nazwa as nazwa,substancje.nazwa as nazwa2 from spozycie inner JOIN produkty on produkty.id = spozycie.id_produktu inner join substancje on substancje.id = produkty.id_substancji where data < '2018-03-23 05:00:00' and data > '2018-03-22 05:00:00' group by produkty.id_substancji

To nie zapiusje mi niektórych leków np sudafed ale ja z wyrażenie usuną inner join substancje to wtedy wypisze wszystkie , ale bez nazwy substancji czynnej.

0

Już ten problem rozwiązałem trzeba było zastosować w obu przypadkach left join zamiast inner join.

0

Teraz mam kolejny problem jak w zapytaniu dam, żeby drukował wszystkie produktu oprócz alkoholu

select produkty.nazwa,sum(spozycie.porcja) as porcja,spozycie.id_produktu as id_produktu,substancje.nazwa as nazwas
, produkty.id_substancji,produkty.rodzaj_porcji as rodza
j from spozycie  
left join produkty on produkty.id = spozycie.id_produktu 
left join przekierowanie_substancji on  przekierowanie_substancji.id_substancji = produkty.id_substancji
 left join substancje on substancje.id = produkty.id_substancji 
where substancje.nazwa != 'alkohol' 
and  data > '$data1' 
and data < '$data2'  
group by produkty.id 

To nie wyskakuje mi produkt sesja, która zawiera kofeinę.

0

Teraz jest sprawa inna a mianowicie produkty, której mają więcej niż jedną substancje to dla tych produktów sumuje tyle razy ile mają produktów próbowałem to dzielić przez count(produkty.id) ale w niektórych przypdkach wyszła zła liczba więc stworzyłem zapytanie, które nic nie daje.

select case 
when count(produkty.id) > 0 
then sum(spozycie.porcja) / count(produkty.id)  
else sum(spozycie.porcja) end  
as porcja ,produkty.ile_procent as ile_procent,spozycie.data as data,spozycie.cena as cena,produkty.nazwa as nazwa 
from spozycie inner join produkty 
on spozycie.id_produktu = produkty.id 
inner join substancje on  
substancje.id = produkty.id_substancji 
where substancje.nazwa = 'alkohol' and spozycie.data > '$data1' and spozycie.data < '$data2' group by produkty.nazwa

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