Algorytm wybieranie z mysql rekordów, które były brane w tym samym dniu

0

Mam pewien problem męczę się już od wczoraj, otóż jest sobie baza gdzie są rekordy, i chcę wybrać tylko te rekordy, które były brane tego samego dnia np. są do pobranie takie rekordy takie id (12,13,23)

I mamy w bazie takie rekordy

id_wziecia data
12 2018-08-04 12117
13 2018-08-04 12117
23 2018-08-04 12117
2 2018-08-05 12117
12 2018-08-05 12117
13 2018-08-05 12117

To w tym wypaDKU BY TYLKO POBRAŁO rekordy z daty 20-18-08-04 i nie ma czegoś takie w sql więc chciałem napisać własny algorytm i napisałem coś takiego i to mi nie zwraca prawidłowych wyników.

$zapytanie = DB::select("select $porcja,data,produkty.nazwa as nazwa,id_produktu from spozycie join produkty on spozycie.id_produktu = produkty.id $join where id_produktu in $produkty $where $group $having $sortuj");
        if ($dzien == "on") print "dobrze";
        $tablica = array();
        $i = 0;
        $bool = false;
        $blad = 0;
        $z = 0;
        $id_p = str_replace('(', '', $produkty);
        $id_p = str_replace(')', '', $id_p);
        $id_p2 = explode(",",$id_p);
        $dat = "";
        $blad2 = false;
        foreach ($zapytanie as $zapytanie2) {
            //print "f";
            $blad = false;
            $data[$i] = explode(" ",$zapytanie2->data);
            if ($dzien == "on") {
                //print "d";
                //if ($i == 0) $bool = true;
                if ( $i != 0 and $data[$i][0] != $data[$i-1][0] ) $bool = true;
                else $bool =false;
//                else if ( $i != 0 and $data[$i][0] != $data[$i-1][0]) {
                    
                    //$dat = $data[$i][0];
                    //print $dat . "<br>";
                    //$bool = true;
                    if ($blad2 == true) {
                      $tablica[$z]["porcja"] = $zapytanie2->porcja;
                      $tablica[$z]["data"] = $zapytanie2->data;
                      $tablica[$z]["nazwa"] = $zapytanie2->nazwa;
                      $tablica[$z]["id_produktu"] = $zapytanie2->id_produktu;  
                      $z++;  
                    }
  //              }
                
                if ($bool == true) {
                   //var_dump($id_p2);
                        print "<font color=red>" . $data[$i][0] . "</font><br>";
                   for ($j=0;$j< count($id_p2);$j++)  {
                       print "kupka";
                       
                       for ($b =$i;$data[$b][0] != $data[$b-1][0];$b--) {
                            if ($data[$b][0] == $id_p2[$j]) {
                                $blad++;
                                break;
                            }
                            print $blad;
                        
                       }
                       
                       
                       $dzien2 = explode("-",$data[$i][0]);
//                       $id_P = DB::select("select id_produktu from spozycie where year(data) = '" . $dzien2[0] . 
  //                             "' and month(data) = '" . $dzien2[1] . "' and day(data) = '" . $dzien2[2] . "' and id_produktu = '" . $zapytanie2->id_produktu . "' and id_produktu = '" . $id_p2[$j] . "'");
    //                   foreach ($id_P as $id_P2) {
                           
      //                     print "kiła ";
        //               }
          //             if (empty($id_P2)) $id_P3 = 0;
            //           else $id_P3 = $id_P2->id_produktu;
              //         print "<font color=red>" . $id_P3 . "</font><br>";
            //           if ($id_P3 == "") {
                       
              //             $blad = false;
                //       }
                       
                       //if ($id_p2[$j] != $zapytanie2->id_produktu) $blad = false;
                       
                   }
                   if (count($id_p2) <=$blad) $blad2 =true;
                   $blad = 0;
                   
                   
                }
                //$bool =false;
            }
            else {
                $tablica[$i]["porcja"] = $zapytanie2->porcja;
                $tablica[$i]["data"] = $zapytanie2->data;
                $tablica[$i]["nazwa"] = $zapytanie2->nazwa;
                $tablica[$i]["id_produktu"] = $zapytanie2->id_produktu;
            }
            $i++;
        }
        var_dump($tablica);
        
    }

Trochę namieszałem i chodzi mi o to, żeby ten algorym porównywał każdy element z tablicy $id_p2 z każdym elemtnem z tablicy bazy danych dla aktualnego dnia i potem jak zdnajdzie porównanie to zwiększa wartośc $blad++ i potem na końcu pętli porówniuje.

0

Jak bym to zrobił tak:

SET @var = DATE_FORMAT(now(),'%y-%m-%d');

masz dzisiejszy dzień

a teraz funkcja grupująca:

select * from tabela having data = @var

Nie wiem czy to jest optymalne rozwiązanie, ale u mnie działa.
Można to też uprościć:

select * from tabela having data = DATE_FORMAT(now(),'%y-%m-%d');
0

Takie zapytanie zwraca 0 wyników.

select * from spozycie  where id_produktu in (98,21) having data = DATE_FORMAT(2018-08-07,'2018-08-08');

0

Ja nie rozumiem dlaczego mam pobrać id 12,13,23, bo to da w wyniku:
12 2018-08-04 12117
13 2018-08-04 12117
23 2018-08-04 12117
12 2018-08-05 12117
13 2018-08-05 12117

ale sformułowanie branie leków które były brane w tym samym dniu, sugeruje, że odwołujemy się do JEDNEGO dnia, więc dlaczego chcesz jeszcze pobrać 2018-08-05?

0

No bo one mogą się odnosić do daty np od 2018-02-1 do 2018-03-14 tylko ma wybrać te leki, które spełniają ten warunek, że były brane tego samego dnia czyli id np 12,13 są w bazie i mają date np. 2018-03-03 i drugi 2018-03-03, ale tych id może być np więcej.

0

Popracuj nad opisaniem problemu, bo ja nie jestem w stanie zrozumieć, skoro piszesz, ze bierzesz okres i później piszesz, że chcesz tylko takie które były brane tego samego dnia, to jest to nielogiczne.

że były brane tego samego dnia czyli id np 12,13 są w bazie i mają date np. 2018-03-03 i drugi 2018-03-03

sprecyzuj co chcesz osiągnąć, bo wg danych z pierwszego posta id 12 było brane 2018-08-04 i 2018-08-05 czyli w 2 RÓŻNE dni a ty chcesz je mieć w wyniku.

0

To wytłumaczę bardzo dokładnie bo są w bazie dni kiedy dane leki były brane w tym samy dniu i chcę, żeby mi wyciągnął dni kiedy te te leki były brane, ale musi być warunek spełnione, że były brane tego samego dnia np.

Są leki takie

id nazwa
12 Polopiryna
13 lek2
14 lek3

I teraz w tabeli spozycie

id data id_produktu
1 2018-01-01 12
2 2018-01-02 13
3 2018-01-02 14
4 2018-01-03 12
5 2018-01-03 13
6 2018-01-03 14
7 2018-01-04 12
8 2018-01-04 13
9 2018-01-04 15

To jeżeli dam takie zapytanie

select data from spozycie where in (12,13,14) data > '2018-01-01'

To w tym wypadku zwróci mi takie wyniki
4   2018-01-03      12
5   2018-01-03      13
6   2018-01-03      14

Bo ten warunek jest spełniony.

0

Staraj się bardziej:

Zapytanie:

SELECT * FROM spozycie WHERE id_produktu IN (12,13,14) and DATA > '2018-01-01'

Zwróci

id data id_produktu
1 2018-01-01T0100Z 12
2 2018-01-02T0100Z 13
3 2018-01-02T0100Z 14
4 2018-01-03T0100Z 12
5 2018-01-03T0100Z 13
6 2018-01-03T0100Z 14
7 2018-01-04T0100Z 12
8 2018-01-04T0100Z 13

http://sqlfiddle.com/#!9/3f87fb/4

Może zamiast pisać zapytania z którymi masz problem, opisz co chcesz osiągnąć

0

Chce, żeby mi zapytanie zwróciło tylko te rekordy, które były brane przez okres jednego dnia czyli trzeba skonstruować zapytanie które zwróci
czyli jak mamy np takie leki lek1,lek4,lek6 to zapytanie zwróci dni w których te leki były brane w okresie jednego dnia czyli wszystkie muszę być wzięte w okresie jednego dnia nie wiem jak to wytłumaczyć ale jak mamy np datę od 2018-06-19 do 2018-07-04 to zwróci mi tylko te dni w których te leki takie jak lek1,lek4,lek6 był← wzięte w tym samym dniu.

3

Coś w ten deseń:

SELECT
    data
FROM
    spozycie 
WHERE
    DATA > '2018-01-01'
    and id_produktu in (12,13,14)
group by 
    data
HAVING    
    count(distinct id_produktu) = 3;

lub tak

select 
    *
from (
    SELECT
        data
        ,concat(';',GROUP_CONCAT(DISTINCT id_produktu SEPARATOR ';'),';') leki
    FROM
        spozycie 
    WHERE
        DATA > '2018-01-01'
    group by 
        data) dane
where
    leki like '%;12;%'
    and leki like '%;13;%'
    and leki like '%;14;%'  

http://sqlfiddle.com/#!9/3f87fb/15

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