2010-06-25 8 views
6

Questo sembra molto semplice, ma non riesco a capirlo.Selezionando una voce corrispondente più tag

Ho una tabella "item_tags" e voglio selezionare tutti gli elementi che corrispondono ai tag 1 e 2 (come in, ogni elemento deve avere entrambi i tag).

Come farei questo in mysql?

Crea una tabella è:

CREATE TABLE `item_tags` (
    `uid_local` int(11) NOT NULL DEFAULT '0', 
    `uid_foreign` int(11) NOT NULL DEFAULT '0', 
    `sorting` int(11) NOT NULL DEFAULT '0', 
    KEY `uid_local` (`uid_local`), 
    KEY `uid_foreign` (`uid_foreign`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

Grazie!

+1

Dove sono le voci, e ciò che è tag 1 e 2 tag? –

risposta

11

Usa:

SELECT i.uid 
    FROM ITEMS i 
    JOIN ITEM_TAGS it ON it.uid_local = i.uid 
        AND it.uid_foreign IN (1, 2) 
GROUP BY i.uid 
    HAVING COUNT(DISTINCT it.uid_foreign) = 2 

È necessario disporre di un GROUP BY e la clausola HAVING definito e il numero di identificatori di tag distinti deve essere uguale al numero di tag specificato nella clausola IN.

+0

Grazie, ha funzionato perfettamente! –

0

qualcosa di simile?

SELECT i.* from items i inner join items_tags it 
on i.id = it.item_id 
inner join tags t 
on t.id = it.tag_id 
WHERE t.name in ('tag1', 'tag2'); 

EDIT:

suppouse avete items_tags: (item_id, tag_id) come tavolo

+1

Questo aproach sarebbe una corrispondenza OR piuttosto che una corrispondenza AND, quindi non risponde alla domanda. ad esempio, questa query troverà gli articoli che corrispondono a tag1 o tag2 .. e potenzialmente restituiranno anche elementi duplicati. La domanda voleva trovare solo gli articoli che avevano entrambi tag1 AND tag2 – timk

Problemi correlati