2013-05-23 2 views
-2

J'utilise sqlite3. J'ai une tâche simple à faire et pour cela je dois écrire une requête SQL qui peut être exécutée dans sqlite3. Veuillez vous référer à la figure ci-dessous pour mes exemples de données, les résultats attendus et la nécessité d'interrogation. Quelqu'un m'a dit un conseil pour utiliser "group by" mais je connais très peu de choses sur SQL.Requête pour trouver le nombre de multiplications dans une table

enter image description here

+1

D'où viennent ces numéros '3 * 1 + 2 * 9 + 4 * 0 ...'? S'il vous plaît, expliquez? –

+0

ces nombres sont des valeurs de colonne "count" correspondantes pour "term" qui sont communes à la fois dans 111 et 222 –

Répondre

3

Essayez cette ..

SELECT sum(t) 
FROM 
    (SELECT f1.count*f2.count t 
    FROM fruits f1, 
     fruits f2 
    WHERE f1.term=f2.term 
    AND f1.docID=111 
    AND f2.docID=222); 

La requête interne multiplie les count de même term de docID = 111 et docID = 222. La requête externe les résume tous.

MISE À JOUR: Comme l'a souligné ypercube, cela peut se faire sans la table dérivée comme ça ..

SELECT SUM(f1.count*f2.count) total 
    FROM fruits f1, 
     fruits f2 
    WHERE f1.term=f2.term 
    AND f1.docID=111 
    AND f2.docID=222); 
+0

d'où nous obtenons le tbl1? –

+0

@vidit: Qu'est-ce que "tb11"? Était-ce censé être des "fruits"? – Jonathan

+1

@ Jonathan- Oh oui, corrigé. Merci :) – vidit

1

est ici une solution avec toutes les étapes intermédiaires tout en travaillant dehors:

d'abord, trouver tous les fruits avec docID 111:

SELECT term, count FROM fruits 
WHERE docID = 111; 

Ensuite, trouver tous les fruits avec docID 222:

SELECT term, count FROM fruits 
WHERE docID = 222; 

ensemble sur les Rejoignez terme. Ceci est un saut conceptuel dans la mesure où vous devez voir la requête initiale ci-dessus comme un ensemble unique, puis joindre les deux ensembles ensemble:

SELECT * 
FROM (SELECT term, count FROM fruits 
     WHERE docID = 111) as f1 
INNER JOIN 
    (SELECT term, count FROM fruits 
     WHERE docID = 222) as f2 
    ON f1.term = f2.term; 

Multiplier les deux colonnes « de comptage »:

SELECT f1.count * f2.count as multicount 
FROM (SELECT term, count FROM fruits 
     WHERE docID = 111) as f1 
INNER JOIN 
    (SELECT term, count FROM fruits 
     WHERE docID = 222) as f2 
    ON f1.term = f2.term; 

Enfin:

Somme toutes ces colonnes ensemble. Un autre saut conceptuel, vous envelopper toute requête que vous aviez avant dans une enveloppe, puis faire des choses pour les résultats de cet ensemble, et qui vous donne une solution finale:

SELECT sum(multicount) total 
FROM (
    SELECT f1.count * f2.count as multicount 
    FROM (SELECT term, count FROM fruits 
      WHERE docID = 111) as f1 
    INNER JOIN 
     (SELECT term, count FROM fruits 
      WHERE docID = 222) as f2 
     ON f1.term = f2.term; 
) as all_fruits; 

Essayez le code: SQLFiddle

+0

Merci beaucoup Jonathan. La réponse est si explicative même si je connais 1% de SQL, je suis capable de comprendre. Pouvez-vous me conseiller comment je peux modifier cette requête quand j'ai besoin de prendre tous les docID à la place de docID = 111 et que docID = 222 reste le même. En fait j'ai besoin d'une sortie en colonnes dans docID et résultat. –

Questions connexes