2010-06-27 3 views
2

J'ai essayé dans 1 heure maintenant, en essayant de trouver comment extraire quelque chose de la base de données, dans un INNER JOIN avec une simple syntaxe SQL. Il fonctionne, presque et ma question est de savoir comment puis-je sélectionner plus d'une seule ligne de la table.Syntaxe SQL avec plus d'une ligne

Ma syntaxe SQL:

SELECT topics.topic_id, topics.topic_subject, COUNT(posts.post_topic) AS comments 
FROM topics 
INNER JOIN posts ON topics.topic_id = posts.post_topic = topics.topic_id 
LIMIT 10 

Et bien sûr, je ne veux pas utiliser la clause WHERE et il ne fonctionne sans WHERE soit. Btw. Je pense que c'est faux après ON, mais je ne suis pas tout à fait sûr.

Merci!

+1

Qu'est-ce que vous essayez de savoir? Est-ce le nombre de sujets avec la valeur de NULL? Ou est-ce le nombre de commentaires sur un post avec la valeur de NULL? Et Aaron a l'air correct, vous n'avez certainement pas besoin de la clause supplémentaire dans le ON. –

+0

Encore une fois, oubliez le NULL et O WH - mon mauvais. J'essaie de faire écho aux 10 sujets les plus récents, puis de trouver combien de commentaires il y a sur chaque article spécifié. – Messing

+0

Affiche les données - ou un exemple qui indique où vous vous attendez à ce que plusieurs lignes soient renvoyées, mais que vous n'obteniez qu'une seule ligne.Vous ne devriez avoir besoin que de quelques lignes dans le sujet et peut-être quatre ou cinq dans les messages. De plus, n'avez-vous pas besoin d'une clause GROUP BY? La plupart des SGBD (et le standard SQL) vous demanderaient de citer cela - bien qu'en réalité, un SGBD puisse parfaitement l'inférer et MySQL peut le faire. –

Répondre

5

Essayez:

SELECT topics.topic_id, topics.topic_subject, COUNT(posts.post_topic) AS comments 
FROM topics 
JOIN posts ON topics.topic_id = posts.post_topic 
GROUP BY topics.topic_id, topics.topic_subject 
LIMIT 10 

COUNT est une fonction sommaire, mais vous ne dites pas la DB comment résumer (à savoir rouler) les données. La clause GROUP BY indique que les données doivent être agrégées en fonction de topic_id et de topic_subject.

Si vous ne sélectionnez que des lignes où topic_id IS NULL, que prévoyez-vous obtenir? (Je suppose que c'est la clé primaire.) Je ne m'attendrais à rien, à moins qu'il y ait des messages orphelins dans la table des messages.

+0

C'est LEFT JOIN au lieu de JOIN, mais cela a fonctionné. Merci! Et oui, c'est la clé primaire. – Messing

+1

+1. joliment repéré! –

3

Avez-vous vraiment besoin du supplément topics.topic_id?

SELECT topics.topic_id, topics.topic_subject, COUNT(posts.post_topic) AS comments FROM topics INNER JOIN posts ON topics.topic_id = posts.post_topic WHERE topic_id = 'NULL' LIMIT 10

Aussi, êtes-vous sûr il y a plus d'une ligne nulle dans le tableau?

+0

Je voudrais simplement sélectionner les 10 lignes de la base de données sans utiliser où, donc le "WHERE topic_id = 'id'" ne devrait pas être là. Oubliez le null et oui j'ai eu plus d'une rangée dans la table. – Messing

1

La notation:

ON topics.topic_id = posts.post_topic = topics.topic_id 

peut être interprété comme:

ON topics.topic_id = (posts.post_topic = topics.topic_id) 

qui pourrait être considéré comme « comparer topic_id avec post_topic et retourner VRAI ou FAUX, puis comparer le topic_id avec VRAI ou FAUX et seulement comparer ceux qui correspondent ", avec (très probablement) VRAI étant converti en 1 et FAUX en 0.

Ou le groupement pourrait être:

ON (topics.topic_id = posts.post_topic) = topics.topic_id 

avec le même résultat net.

Forte recommandation: supprime la condition d'égalité superflue! Il confond les lecteurs, même s'il ne confond pas le SGBD.