Объединение двух таблиц без возврата ненужной строки

Моя структура таблицы выглядит так:

      tbl.users                       tbl.issues
+--------+-----------+   +---------+------------+-----------+
| userid | real_name |   | issueid | assignedid | creatorid |
+--------+-----------+   +---------+------------+-----------+
|   1    |   test_1  |   |    1    |     1      |     1     |
|   2    |   test_2  |   |    2    |     1      |     2     |
+--------+-----------+   +---------+------------+-----------+

В основном я хочу написать запрос, который будет иметь следующую таблицу результатов:

                           (results table)
+---------+------------+---------------+-----------+--------------+
| issueid | assignedid | assigned_name | creatorid | creator_name |
+---------+------------+---------------+-----------+--------------+
|    1    |     1      |    test_1     |    1      |    test_1    |
|    2    |     1      |    test_1     |    2      |    test_2    |
+---------+------------+---------------+-----------+--------------+

Мой SQL сейчас выглядит так:

SELECT 
  `issues`.`issueid`,
  `issues`.`creatorid`,
  `issues`.`assignedid`,
  `users`.`real_name`
FROM `issues`
JOIN `users` 
  ON ( `users`.`userid` = `issues`.`creatorid` )
  OR (`users`.`userid` = `issues`.`assignedid`)
ORDER BY `issueid` ASC
LIMIT 0 , 30 

Это возвращает что-то вроде этого:

                (results table)
+---------+------------+-----------+-----------+
| issueid | assignedid | creatorid | real_name |
+---------+------------+-----------+-----------+
|    1    |     1      |     1     |   test_1  |
|    2    |     1      |     2     |   test_1  |
|    2    |     1      |     2     |   test_2  |
+---------+------------+-----------+-----------+

Может ли кто-нибудь помочь мне добраться до таблицы желаемых результатов?


person Ross    schedule 31.10.2008    source источник


Ответы (6)


Что касается общих знаний, наш прославленный основатель сайта написал в блоге очень хорошую статью на эту тему, на которую я снова и снова ссылаюсь.

Визуальное объяснение объединений SQL

person Mark Biek    schedule 31.10.2008

Использовать этот:

SELECT 
`issues`.`issueid`,
`issues`.`creatorid`,
`creator`.`real_name`,
`issues`.`assignedid`,
`assigned`.`real_name`
FROM `issues` i
INNER JOIN `users` creator ON ( `creator`.`userid` = `issues`.`creatorid` )
INNER JOIN `users` assigned ON (`assigned`.`userid` = `issues`.`assignedid`)
ORDER BY `issueid` ASC
LIMIT 0 , 30
person Noah Goodrich    schedule 31.10.2008

SELECT DISTINCT (i.issueid, i.creatorid, i.assignedid, u.real_name)
FROM issues i, users u
WHERE u.userid = i.creatorid OR u.userid = assignedid
ORDER BY i.issueid ASC
LIMIT 0 , 30

Не уверен, нужны скобки или нет.

person Elie    schedule 31.10.2008
comment
Извините, это все еще возвращает двойную строку для проблемы №2. - person Ross; 31.10.2008

Это работает?

ВЫБЕРИТЕ i.issueid, i.assignedid, u1.real_name как назначенное_имя, i.creatorid, u2.real_name как имя_создателя ОТ пользователей u1 INNER JOIN выдает i ON u1.userid = i.assignedid INNER JOIN users u2 ON u2.userid = i. creatorid ЗАКАЗ ОТ i.issueid

person JGW    schedule 31.10.2008

ВЫБРАТЬ
i.issueid,
i.assignedid,
a.real_name,
i.creatorid,
c.real_name
FROM
проблемы i
INNER JOIN пользователи c
ON c.userid = i.creatorid
INNER JOIN пользователи a
ON a.userid = i.assignedid
ORDER BY
i.issueid ASC

person Community    schedule 31.10.2008

person    schedule
comment
Я предполагаю, что есть два внешних ключа от issues.creatorid, issues.assignedid до users.userid, и что ничто не может иметь значение null в каждой таблице. Учитывая эти предпосылки, есть ли разница между использованием левых и внутренних соединений? Один естественнее или быстрее другого? - person Federico A. Ramponi; 31.10.2008