Выборка данных из 3 SQL таблиц

315
22 сентября 2017, 21:13

В двух словах, есть 3 таблицы в БД:

  1. Cписок всех игроков
  2. Cписок имён этих игроков (отдельно, потому что здесь все данные об аккаунтах)
  3. Cписок друзей (кто кого добавил в друзья в игре)

Мне нужно достать имена из 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 (тот кто отправил запрос)

Answer 1

Для того, чтобы получить уникальные значения, следует использовать 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 и будут выданы все совпадающие записи.

Ссылка на документацию.

READ ALSO
функция mysql_query

функция mysql_query

Здесь на сайте нашёл вопрос и к нему очень интересный комментарий, что функции mysql_query не существуетНо я её использую, и она есть в php

147
действия с датой выводом на таблицу php

действия с датой выводом на таблицу php

у меня есть три таблицы:

199
Запрос к БД и получение данных в JSON

Запрос к БД и получение данных в JSON

Пытаюсь сделать запрос к БД и получить данные в JSON формате делаю так, но открывается пустая страница без ничего, хотя в таблице есть куча записейОколо...

339
Как не повторить один и тот тоже запрос SELECT * FROM?

Как не повторить один и тот тоже запрос SELECT * FROM?

В коде один и тот же запрос sql, повторяется несколько раз в коде, как можно сократить код что бы не каждый раз его заново написать, в функции...

211