2013-09-25 4 views
-1

Par exemple, je possède la table et les valeurs:complexe mysql requête de sélection 7

CREATE TABLE IF NOT EXISTS `words` (
    `wd_id` int(11) NOT NULL, 
    `st_id` int(11) NOT NULL, 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

---------------------------- 
| wd_id | st_id | 
---------------------------- 
|  2  |  4  | 
---------------------------- 
|  5  |  4  | 
---------------------------- 
|  7  |  8  | 
---------------------------- 
|  2  |  8  | 
---------------------------- 
|  7  |  9  | 
---------------------------- 
|  2  |  10  | 
---------------------------- 
|  5  |  10  | 
---------------------------- 

wd_id est id mot
st_id est id de la peine

si je sais id de deux mots. Je veux obtenir la liste des phrases qui ont ces mots. par exemple, cet ID est 2 et 5 alors RÉPONSE sera 4 et 10.

Dans cette table sera milions de lignes. J'ai donc besoin d'écrire une question attentivement !!!

ici est question que j'ai écrit:

SELECT st_id 
    FROM words 
    WHERE wd_id = 5 AND st_id IN (
     SELECT st_id 
     FROM words 
     WHERE wd_id = 2 
    ) 

Peut-on écrire mieux QUERY? OU QUESTION QUI FONCTIONNERA pour N mots?
ET SI J'INDIQUE DES INDICES POUR wd_id ET st_id COLUMNS cette requête sera plus rapide oui?
ET QUEL TYPE D'INDICES SERAIT BON?

+0

Oui, vous devez ajouter des index à tous les champs que vous utilisez dans votre condition « Où? ». Vous ne remarquerez pas d'augmentation de la vitesse jusqu'à ce que l'ensemble de données commence à croître, car le coût d'une analyse de table complète est faible alors que le nombre d'enregistrements est faible. –

Répondre

0
SELECT st_id 
FROM words 
WHERE wd_ID IN (2, 5) 
GROUP BY st_id 
HAVING COUNT(DISTINCT wd_ID) = 2 

Si wd_ID est unique pour chaque st_id, vous n'avez pas besoin d'avoir DISTINCT dans la clause ayant,

HAVING COUNT(*) = 2 

Vous pouvez en savoir plus sur ce lien,

+0

Merci! Pouvez-vous exclure cette partie AYANT COMPTE (DISTINCT wd_ID) = 2 et comment sera interrogé N mots? – Guno

+0

La requête filtre tout 'st_id' qui a * soit * 5' ou' 2' valeur de 'wd_ID'. Ensuite, il regroupe les enregistrements 'st_id' et filtrage seulement qui ont une valeur de' 2', * résultat de l'agrégation des lignes *, puisque vous recherchez deux valeurs dans 'st_id'. [SQLFiddle Demo] (http://sqlfiddle.com/#!2/0f338/9) –

+0

ET QU'EN EST-IL POUR N MOTS? Pouvez-vous me donner une idée? – Guno