Mysql DISTINCT 仍然 return 重复值
Mysql DISTINCT still return duplicate value
我怎样才能避免在 friends
上重复我仍然得到两个 bob
而不是只有一个 bob
我的 table 设置:
CREATE TABLE users(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255)
);
INSERT INTO users (id, name)
VALUES (1, "Gregor"),
(2, "Liza"),
(3, "Matt"),
(4, "Tim"),
(5, "Lance"),
(6, "Bob");
CREATE TABLE committee(
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
friend_id INT,
member_id INT,
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`),
FOREIGN KEY (`friend_id`) REFERENCES `users` (`id`),
FOREIGN KEY (`member_id`) REFERENCES `users` (`id`)
);
INSERT INTO committee (user_id, friend_id, member_id)
VALUES (3, 5, 1),
(4, 5, 1),
(3, 6, 2),
(3, 6, 2),
(4, 6, 2);
我使用的查询:
SELECT DISTINCT u.name,
GROUP_CONCAT(f.name) AS friends
FROM committee c
INNER JOIN users u ON (u.id = c.user_id)
INNER JOIN committee c2 ON c2.user_id = c.user_id
INNER JOIN users AS f ON (f.id = c2.friend_id)
WHERE (c.member_id = 1)
GROUP BY u.id;
当前结果:
name friends
Matt Lance,Bob,Bob
Tim Lance,Bob
我的期望:
name friends
Matt Lance,Bob
Tim Lance,Bob
你只需要 DISTINCT
在 GROUP_CONCAT()
内:
SELECT u.name,
GROUP_CONCAT(DISTINCT f.name) AS friends
................................................
请注意,SELECT DISTINCT ...
在您的查询中没有意义,因为您正在使用 GROUP BY
每个用户 returns 不同的行。
参见demo。
您有不同的 u.name 不在 f.name
试试这个
SELECT u.name,
GROUP_CONCAT(distinct f.name) AS friends
FROM committee c
INNER JOIN users u ON (u.id = c.user_id)
INNER JOIN committee c2 ON c2.user_id = c.user_id
INNER JOIN users AS f ON (f.id = c2.friend_id)
WHERE (c.member_id = 1)
GROUP BY u.name;
我怎样才能避免在 friends
上重复我仍然得到两个 bob
而不是只有一个 bob
我的 table 设置:
CREATE TABLE users(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255)
);
INSERT INTO users (id, name)
VALUES (1, "Gregor"),
(2, "Liza"),
(3, "Matt"),
(4, "Tim"),
(5, "Lance"),
(6, "Bob");
CREATE TABLE committee(
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
friend_id INT,
member_id INT,
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`),
FOREIGN KEY (`friend_id`) REFERENCES `users` (`id`),
FOREIGN KEY (`member_id`) REFERENCES `users` (`id`)
);
INSERT INTO committee (user_id, friend_id, member_id)
VALUES (3, 5, 1),
(4, 5, 1),
(3, 6, 2),
(3, 6, 2),
(4, 6, 2);
我使用的查询:
SELECT DISTINCT u.name,
GROUP_CONCAT(f.name) AS friends
FROM committee c
INNER JOIN users u ON (u.id = c.user_id)
INNER JOIN committee c2 ON c2.user_id = c.user_id
INNER JOIN users AS f ON (f.id = c2.friend_id)
WHERE (c.member_id = 1)
GROUP BY u.id;
当前结果:
name friends
Matt Lance,Bob,Bob
Tim Lance,Bob
我的期望:
name friends
Matt Lance,Bob
Tim Lance,Bob
你只需要 DISTINCT
在 GROUP_CONCAT()
内:
SELECT u.name,
GROUP_CONCAT(DISTINCT f.name) AS friends
................................................
请注意,SELECT DISTINCT ...
在您的查询中没有意义,因为您正在使用 GROUP BY
每个用户 returns 不同的行。
参见demo。
您有不同的 u.name 不在 f.name
试试这个
SELECT u.name,
GROUP_CONCAT(distinct f.name) AS friends
FROM committee c
INNER JOIN users u ON (u.id = c.user_id)
INNER JOIN committee c2 ON c2.user_id = c.user_id
INNER JOIN users AS f ON (f.id = c2.friend_id)
WHERE (c.member_id = 1)
GROUP BY u.name;