2010-08-11 6 views
0

J'ai cette requête qui devrait afficher tous les messages liés à un tag spécifique mais pour une raison quelconque, il n'affichera qu'un seul résultat au lieu de tous les résultats. Quelqu'un peut-il m'aider à résoudre ce problème?Problème d'affichage de requête MySQL

Voici le code MySQL.

"SELECT users.*, users_posts.*, tags.*, posts_tags.*, 
FROM users 
INNER JOIN users_posts ON users_posts.user_id = users.user_id 
INNER JOIN posts_tags ON users_posts.id = posts_tags.posts_id 
INNER JOIN tags ON posts_tags.tag_id = tags.id 
WHERE tags.tag = '" . $tag_id . "' 
GROUP BY tags.tag" 

Voici ma table MySQL.

CREATE TABLE posts_tags (
id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
tag_id INT UNSIGNED NOT NULL, 
users_posts_id INT UNSIGNED NOT NULL, 
PRIMARY KEY (id) 
); 

CREATE TABLE tags (
id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
tag VARCHAR(255) NOT NULL, 
PRIMARY KEY (id) 
); 


CREATE TABLE users_posts (
id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
user_id INT UNSIGNED NOT NULL, 
content TEXT NOT NULL, 
PRIMARY KEY (id) 
); 


CREATE TABLE users (
user_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
name VARCHAR(255) NOT NULL, 
pass CHAR(40) NOT NULL, 
PRIMARY KEY (user_id) 
); 
+0

Pouvez-vous donner un exemple de la sortie que vous vous attendez? –

+0

@Daniel Vassallo Je m'attends à ce que tous les messages liés à ce tag spécifique soient affichés. – pops

+0

Débarrassez-vous du 'GROUP BY' mais sinon le seul problème que je peux voir est que les données que vous pensez existent, ne –

Répondre

2

J'ai ajouté quelques données de test à vos tables:

INSERT INTO tags VALUES (1, 'mysql'); 
INSERT INTO tags VALUES (2, 'javascript'); 
INSERT INTO tags VALUES (3, 'c++'); 

INSERT INTO users VALUES (1, 'user a', 'pass'); 
INSERT INTO users VALUES (2, 'user b', 'pass'); 
INSERT INTO users VALUES (3, 'user c', 'pass'); 

INSERT INTO users_posts VALUES (1, 1, 'some content 1'); 
INSERT INTO users_posts VALUES (2, 1, 'some content 2'); 
INSERT INTO users_posts VALUES (3, 2, 'some content 3'); 
INSERT INTO users_posts VALUES (4, 2, 'some content 4'); 
INSERT INTO users_posts VALUES (5, 2, 'some content 5'); 
INSERT INTO users_posts VALUES (6, 3, 'some content 6'); 

INSERT INTO posts_tags VALUES (1, 1, 1); 
INSERT INTO posts_tags VALUES (2, 2, 1); 
INSERT INTO posts_tags VALUES (3, 1, 2); 
INSERT INTO posts_tags VALUES (4, 3, 2); 
INSERT INTO posts_tags VALUES (5, 2, 3); 
INSERT INTO posts_tags VALUES (6, 2, 4); 
INSERT INTO posts_tags VALUES (7, 3, 4); 
INSERT INTO posts_tags VALUES (8, 1, 5); 
INSERT INTO posts_tags VALUES (9, 2, 6); 
INSERT INTO posts_tags VALUES (10, 3, 6); 

enlever ensuite les GROUP BY:

SELECT  * 
FROM  users 
INNER JOIN users_posts ON users_posts.user_id = users.user_id 
INNER JOIN posts_tags ON users_posts.id = posts_tags. users_posts_id 
INNER JOIN tags ON posts_tags.tag_id = tags.id 
WHERE  tags.tag = 'mysql'; 

Retours:

+---------+--------+------+----+---------+----------------+----+--------+----------------+----+-------+ 
| user_id | name | pass | id | user_id | content  | id | tag_id | users_posts_id | id | tag | 
+---------+--------+------+----+---------+----------------+----+--------+----------------+----+-------+ 
|  1 | user a | pass | 1 |  1 | some content 1 | 1 |  1 |    1 | 1 | mysql | 
|  1 | user a | pass | 2 |  1 | some content 2 | 3 |  1 |    2 | 1 | mysql | 
|  2 | user b | pass | 5 |  2 | some content 5 | 8 |  1 |    5 | 1 | mysql | 
+---------+--------+------+----+---------+----------------+----+--------+----------------+----+-------+ 
3 rows in set (0.00 sec) 

Il est juste une ligne par poste , aussi longtemps que Les messages électroniques ne sont pas associés au même tag plusieurs fois. En fait, pour éviter que cela se produise, vous voudrez peut-être envisager d'éliminer la surrogate key dans posts_tags et utiliser une clé primaire composite sur (tag_id, users_posts_id):

CREATE TABLE posts_tags (
    tag_id INT UNSIGNED NOT NULL, 
    users_posts_id INT UNSIGNED NOT NULL, 
    PRIMARY KEY (tag_id, users_posts_id) 
); 
+0

J'ai attrapé deux, alors j'ai changé 'GROUP BY tags.tag' à' GROUP BY posts_tags.posts_id' – pops