Search code examples
mysqljoingroup-bydistinctgroup-concat

Mysql DISTINCT still return duplicate value


How can i avoid getting duplicate on friends i still get two bob instead only one bob

My table setup:

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);

query i use:

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;

current result:

name    friends
Matt    Lance,Bob,Bob
Tim Lance,Bob

what i expect:

name    friends
Matt    Lance,Bob
Tim Lance,Bob

Solution

  • You need DISTINCT inside GROUP_CONCAT() only:

    SELECT u.name,
           GROUP_CONCAT(DISTINCT f.name) AS friends
    ................................................
    

    Note that SELECT DISTINCT ... does not make sense in your query because you are using GROUP BY which returns distinct rows for each user.

    See the demo.