2014-09-08 2 views
0

Outline: J'ai deux tables - une avec un dictionnaire d'auteurs et de livres, et une autre avec quelques comparaisons entre des livres d'auteurs différents.Manipulation de données avec MySQL - joindre et compter

Book_id(PK) Author    Book_id_1(CPK) Book_id_2(CPK) Book_similarity 
=====================    ================================================== 
1    Amy     1    3     High 
2    Amy     1    4     Low 
3    Ben     2    3     High 
4    Ben     2    4     High 
            3    1     High 
            3    2     High 
            4    1     Low 
            4    2     High 

Problème: Je suis en train de faire une requête où il retourne le tableau ci-dessous, en comptant le nombre de similitudes « haut » et « bas » trouvés - cette trace les livres aux auteurs qui ont écrit leur.

Author_1(CPK)  Author_2(CPK) Num_high Num_low 
==================================================== 
Amy    Ben    3   1 
Ben    Amy    3   1 

Je sais qu'il ya un chevauchement dans la table finale, mais il est la seule façon que je peux le faire pour qu'il y ait une colonne qui est consultable. Je suppose que je dois utiliser deux requêtes pour générer le résultat et une jointure quelque part, mais je suis encore assez nouveau pour MySQL.

NB: En utilisant python et MySQLdb, si cela va être utile. Sinon, je vais juste brancher la requête dans le cury cur.execute().

Répondre

0

La question est très claire, mais je suppose que vous cherchez quelque chose comme ceci:

SELECT b1.Author AS Author_1, b2.Author AS Author_2, 
SUM(CASE WHEN s.Book_similarity = 'High' THEN 1 ELSE 0 END) AS Num_high, 
SUM(CASE WHEN s.Book_similarity = 'Low' THEN 1 ELSE 0 END) AS Num_low 
FROM similarity s 
INNER JOIN book b1 ON b1.book_id = s.book_id_1 
INNER JOIN book b2 ON b2.book_id = s.book_id_2 
GROUP BY b1.Author, b2.Author 

Fondamentalement, il vous suffit de joindre à la table de livre sur les deux book_id dans le tableau de similarité (donc vous pouvez accéder à l'auteur des livres dans book_id_1 et book_id_2), puis compter 1 chaque fois que la similarité est faible pour Num_low, et la même chose pour Num_high (lorsque la similarité est élevée bien sûr).

+0

génie! Merci beaucoup. Je pense que 'a1' et' a2' devraient être 'b1' et' b2', btw. Désolé, la question était un peu floue. Cela vous dérange de donner une brève explication de ce que cette requête fait? – HMcG

+0

Vous avez raison, j'ai corrigé. –

+0

J'ai ajouté quelques explications. Je ne sais pas si c'est clair, mais la requête semble assez explicite, je ne sais pas quoi ajouter qui ne paraphraserait pas la requête (je sens que je l'ai déjà fait). –