[MySQL] Problem z SELECT

0

Witam,

Piszę program jednak napotkałem problem... otóż mam tabelę:
id | kontoid | preferencjaid
1 | 2 | 4
2 | 2 | 5
3 | 2 | 7
4 | 3 | 5
5 | 4 | 4
6 | 4 | 5

gdzie każde konto może mieć wybrane preferencje (kilka, bądź wcale). Chcę napisać zapytanie, które będzie wybierało tylko te numery id kont, które będą posiadały określone preferencjeid np kontoid, które ma preferencjeid = 5 oraz 7. W tabeli powyżej to będzie jedynie kontoid = 2.

Pomożecie?

0

o_O?

select kontoid
from tabela
where (preferencjaid = 5) or (preferencjaid = 7)
0

OR nie może być, bo kontoid = 3 nie posiada preferencjiid = 7

To musi spełniać warunek: kontoid, które posiada zarówno preferencje 5 i 7.

0

To mogłeś napisać że ma je zawierać jednocześnie. Bo twoje zdanie można było zrozumieć na dwa sposoby.
Teraz przynajmniej widzę gdzie mogłeś mieć problem ;]

select t1.kontoid
from tabela as t1 inner join tabela as t2 on (t1.kontoid = t2.kontoid)
where (t1.preferencjaid = 5) and (t2.preferencjaid = 7)
0

Dobrze, ale to zapytanie nie będzie 'uniwersalne', co będzie gdy zapytanie będzie o np. nie określone 2 preferencje, a np. 4 i więcej?

0

Chcesz uniwersalnie? Proszę bardzo. Stwórz sobie tabelkę pomocniczą 'preferencje':

CREATE TABLE preferencje(preferencjaid INT);

Przed każdym zapytaniem czyść ją i wypełniaj ponownie danymi.

DELETE FROM preferencje;
INSERT INTO preferencje( preferencjaid ) VALUES ( 5 ) ;
INSERT INTO preferencje( preferencjaid ) VALUES ( 7 ) ;

SELECT t.kontoid 
FROM tabela t
INNER JOIN preferencje p ON p.preferencjaid = t.preferencjaid
GROUP BY t.kontoid
HAVING COUNT(*) = (SELECT COUNT(*) FROM preferencje)

Teraz bez względu na ilość sprawdzanych preferencji zapytanie zawsze będzie działać i zwróci to co chcesz.

0

Dziękuje, trochę jest to skomplikowane biorąc pod uwagę jak mało się chce uzyskać. Pozdrawiam

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