Jak powinno wyglądać zapytane wyciągjące takie dane

0

Mam taki pytanie jak powinno wyglądać zapytanie wyciągające dane z 3 tabel bo w jednej tabeli są nastroje i nastroje mogą mieć kilka wpisanych leków i teraz jak powinno wyglądać zapytanie, które wybierze np leki o nazwach vetira i lit, ale tylko takie wpisy gdzie te leki były wpisany w ten sam nastrój.próbowałem takiego czegoś.

SELECT * FROM `nastroj` join przekierowanie_lekow on nastroj.id = przekierowanie_lekow.id_nastroj inner join leki on leki.id = przekierowanie_lekow.id_leku where leki.nazwa = "vetira" or leki.nazwa = 'lit' and nastroj.id = przekierowanie_lekow.id_nastroj group by przekierowanie_lekow.id_nastroj 

Ale to mi wywala nawet nastroje gdzie były brane leki w osobnych nastrojach.

Tabela nastroj

CREATE TABLE `nastroj` (
  `id` int(11) NOT NULL,
  `id_dziennik` int(11) DEFAULT NULL,
  `godzina_zaczecia` datetime NOT NULL,
  `godzina_zakonczenia` datetime NOT NULL,
  `id_users` int(11) NOT NULL,
  `poziom_nastroju` smallint(6) NOT NULL,
  `co_robilem` text COLLATE utf8mb4_unicode_ci,
  `id_lekow` int(11) DEFAULT NULL,
  `poziom_leku` smallint(6) NOT NULL,
  `poziom_zdenerwania` smallint(6) NOT NULL,
  `epizod_psychotyczne` smallint(6) NOT NULL,
  `pobudzenie` smallint(6) NOT NULL,
  `id_dnia` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

tabela leki

CREATE TABLE `leki` (
  `id` int(11) NOT NULL,
  `nazwa` varchar(100) NOT NULL,
  `dawka` float NOT NULL,
  `data_spozycia` datetime NOT NULL,
  `id_users` int(11) NOT NULL,
  `porcja` tinyint(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

tabela przekirowania lekow

CREATE TABLE `przekierowanie_lekow` (
  `id` int(11) NOT NULL,
  `id_leku` int(11) NOT NULL,
  `id_nastroj` int(11) NOT NULL,
  `id_user` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
0

Samo zapytanie, to jest masakra, po co group by, skoro pokazujesz wszystkie kolumny?
Problemem jest zapytanie i warunek where jeśli używasz alternatywy to zgrupuj ją w nawiasy, bo inaczej nie będziesz miał to czego oczekujesz, lub użyj in:

SELECT * 
FROM 
    `nastroj` JOIN przekierowanie_lekow ON nastroj.id = przekierowanie_lekow.id_nastroj 
     INNER JOIN leki ON leki.id = przekierowanie_lekow.id_leku 
WHERE 
     (leki.nazwa = "vetira" 
     OR leki.nazwa = 'lit' )
    AND nastroj.id = przekierowanie_lekow.id_nastroj 
GROUP BY przekierowanie_lekow.id_nastroj
0

@pol90: ja nie wiem co ty chcesz osiągnąć, nie rozumiem tego co napisałeś, zapytanie które napisałeś niewiele wnosi ponieważ, warunek sprzężenia tabel nastroj i przekierowanie_lekow powtórzyłeś w warunku where, co samo w sobie nie ma sensu. Odbisałem widząc błąd w WHERE jak chcesz więcej to musisz dokładnie opisać dane.

0

Dobrze chcę, żeby pokazywał tylko te nastroje gdzie były brane takie leki jak vetira i lit czyli muszą być brane w jednym nastroju te dwa leki przykładowo mamy nastrój
id 1
poziom nastroju 6
leki vetira
lit
lek x
id 2 poziom nastroju 5
leki vetira
lek x

To w tym przypadku ma wybrać tylko nastrój o id 1.

2

To coś takiego:

SELECT * FROM NASTROJE 
WHERE ID IN (
SELECT 
     nastroj.id
FROM 
    `nastroj` 
     inner JOIN przekierowanie_lekow ON nastroj.id = przekierowanie_lekow.id_nastroj 
     left join JOIN leki ON leki.id = przekierowanie_lekow.id_leku and leki.nazwa in ('vetira','lit')
GROUP BY 
      nastroj.id
HAVING
   COUNT(distinct LEKI.ID) = 2)
0

A jak bym chciał zwrócić liczbę wszystkich rekordów, które są w tabeli to jak dam count(*) to zwraca 1 lub 2 a jak zrobić żeby zwrócił liczbę wszystkich rekordów ?

0

Jednak mi się coś pomyliło dobrze zwraca.

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