В двух словах, есть 3 таблицы в БД:
Мне нужно достать имена из 2 таблицы (колонка firstname), количество опыта из 1 таблицы (колонка exp) и проверить чтобы id игрока было в 3 таблице (в колонке user1 или user2).
Мой запрос:
SELECT
f.exp AS Exp,
u.firstname AS Name
FROM farmer f
JOIN customer u ON f.userId = u.customer_id
JOIN friendship fr ON fr.user1 = 33 OR fr.user2 = 33
ORDER BY (f.exp) DESC
Он работает, но получаются дубли. Что я сделал не так?
Ответ:
В итоге у меня получился вот такой запрос. Это выборка списка друзей и тех кто добавляется в друзья к игроку, которая берется из трёх таблиц.
SELECT DISTINCT
userId as id,
exp,
oc_customer.firstname as name,
CONCAT(IFNULL(fr1.question,''),IFNULL(fr2.question,'')) as status,
CONCAT(IFNULL(fr1.user2,''),IFNULL(fr2.user2,'')) as inviter
FROM farmer
LEFT JOIN oc_customer ON customer_id=userId
LEFT JOIN friendship as fr1 ON fr1.user1='$userId'
AND (fr1.question=2 OR fr1.question=1) AND fr1.user2=userId
LEFT JOIN friendship as fr2 ON fr2.user1=userId
AND (fr2.question=2 OR fr2.question=1)AND fr2.user2='$userId'
WHERE userId!='$userId'
AND ((fr1.question=2 OR fr1.question=1) OR (fr2.question=2 OR fr2.question=1))
ORDER BY (exp)
DESC
status - 2 (друг), status - 1 (запрос в друзья), inviter (тот кто отправил запрос)
Для того, чтобы получить уникальные значения, следует использовать SELECT DISTINCT ...
Из документации:
The ALL and DISTINCT modifiers specify whether duplicate rows should be returned. ALL (the default) specifies that all matching rows should be returned, including duplicates. DISTINCT specifies removal of duplicate rows from the result set. It is an error to specify both modifiers. DISTINCTROW is a synonym for DISTINCT.
Это значит, что если использовать SELECT без указания DISTINCT или DISTINCTROW, то будет использоваться модификатор ALL и будут выданы все совпадающие записи.
Ссылка на документацию.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей