Efficient matches vinden
Ik heb een tabel met 10.000 accounts (account_id, account_naam)
Ik heb een tabel met 300 fruitsoorten (fruit_Id, fruit_naam)
Ik heb hiertussen een koppeltabel met bijv. 100.000 ooitgegeten (account_id, fruit_id)
Nu wil ik een select maken (liefst natuurlijk met 1 query) dat bepaalt welke accounts een bepaalde combinatie van fruit hebben gegeten.
Een lijst met alle account-id's die ooit kiwi (fruit_id = 1) hebben gegeten is simpel
'SELECT account_id FROM ooitgegeten WHERE fruit_id = 1'
of, via een join
'SELECT a.account_id FROM account AS a INNER JOIN ooitgegeten AS o ON a.account_id = o.account_id WHERE o.fruit_id=1;'
Een lijst met alle account-id's die ooit kiwi én banaan (fruit_id=2) hebben gegeten doen we met twee joins:
'SELECT a.account_id FROM (account AS a INNER JOIN ooitgegeten AS o1 ON a.account_id = o1.account_id) INNER JOIN ooitgegeten AS o2 ON a.account_id = o2.account_id WHERE (((o1.fruit_id)=1) AND ((o2.fruit_id)=2));'
Een lijst met kiwi, banaan en appel kan worden opgehaald met drie joins:
'SELECT a.account_id FROM ((account AS a INNER JOIN ooitgegeten AS o1 ON a.account_id = o1.account_id) INNER JOIN ooitgegeten AS o2 ON a.account_id = o2.account_id) INNER JOIN ooitgegeten AS o3 ON a.account_id = o3.account_id WHERE (((o1.fruit_id)=1) AND ((o2.fruit_id)=2) AND ((o3.fruit_id)=3));'
Voor iedere parameter komt er dus een alias van de ooitgegeten-tabel bij. Het systeem werkt op zich prima, echter: het aantal parameters waarop in praktijk gefilterd gaat worden ligt minimaal rond de 50, en ik vraag me af of dit niet wat eleganter/efficienter kan dan met 50 joined alias-tabellen...
Ik heb een tabel met 10.000 accounts (account_id, account_naam)
Ik heb een tabel met 300 fruitsoorten (fruit_Id, fruit_naam)
Ik heb hiertussen een koppeltabel met bijv. 100.000 ooitgegeten (account_id, fruit_id)
Nu wil ik een select maken (liefst natuurlijk met 1 query) dat bepaalt welke accounts een bepaalde combinatie van fruit hebben gegeten.
Een lijst met alle account-id's die ooit kiwi (fruit_id = 1) hebben gegeten is simpel
'SELECT account_id FROM ooitgegeten WHERE fruit_id = 1'
of, via een join
'SELECT a.account_id FROM account AS a INNER JOIN ooitgegeten AS o ON a.account_id = o.account_id WHERE o.fruit_id=1;'
Een lijst met alle account-id's die ooit kiwi én banaan (fruit_id=2) hebben gegeten doen we met twee joins:
'SELECT a.account_id FROM (account AS a INNER JOIN ooitgegeten AS o1 ON a.account_id = o1.account_id) INNER JOIN ooitgegeten AS o2 ON a.account_id = o2.account_id WHERE (((o1.fruit_id)=1) AND ((o2.fruit_id)=2));'
Een lijst met kiwi, banaan en appel kan worden opgehaald met drie joins:
'SELECT a.account_id FROM ((account AS a INNER JOIN ooitgegeten AS o1 ON a.account_id = o1.account_id) INNER JOIN ooitgegeten AS o2 ON a.account_id = o2.account_id) INNER JOIN ooitgegeten AS o3 ON a.account_id = o3.account_id WHERE (((o1.fruit_id)=1) AND ((o2.fruit_id)=2) AND ((o3.fruit_id)=3));'
Voor iedere parameter komt er dus een alias van de ooitgegeten-tabel bij. Het systeem werkt op zich prima, echter: het aantal parameters waarop in praktijk gefilterd gaat worden ligt minimaal rond de 50, en ik vraag me af of dit niet wat eleganter/efficienter kan dan met 50 joined alias-tabellen...
Canon 400D, Sigma 17-70 2.8-4.5, Canon 50 1.8