Используя MySQL, я пытаюсь извлечь ВСЕХ people, у которых company_id соответствует 3, а также сравнить, существует ли этот person в таблице favourites.

Я заметил, что если у человека нет job_id, то они не выводятся по запросу ниже.

Приведенный ниже запрос выводит 1 строку, но в таблице people есть 3 строки, которые соответствуют company_id из 3

                SELECT *,
                           j.company_id as companyid,
                           f.id IS NOT NULL AS jid,
                           p.id as pid,
                           f.id AS fave_id,
                           f.id IS NOT NULL AS fave
                      FROM people p  
                INNER JOIN job j 
                        ON p.job_id = j.id
                 LEFT JOIN favourites f
                        ON f.people_id=p.id
                       AND f.user_id = 12
                     WHERE p.company_id = 3
                  ORDER BY p.id ASC

SQLFiddle

Любая помощь приветствуется, чтобы получить запрос для вывода всех совпадающих строк, а также проверить таблицу favourites.

0
ngplayground 18 Авг 2014 в 19:50
Вы выполняете внутреннее соединение по заданию по job_id, но не имеете совпадающих значений в таблице лиц, и под совпадающими значениями я имею в виду, что есть пустая пустая строка для одной строки, которую вы хотите видеть с условием ON
 – 
John Ruddell
18 Авг 2014 в 19:53

2 ответа

Лучший ответ

Если вы поместите левое соединение на job, оно покажет людей, у которых нет job_id. Я обновил скрипку здесь.

SELECT
    p.*,
    j.company_id as companyid,        
    f.id IS NOT NULL AS jid,
    p.id as pid,
    f.id AS fave_id,
    f.id IS NOT NULL AS fave
FROM people p  
LEFT JOIN job j 
       ON j.id = p.job_id
LEFT JOIN favourites f 
       ON f.people_id=p.id
      AND f.user_id = 12
WHERE p.company_id = 3
ORDER BY p.id ASC
1
Donal 18 Авг 2014 в 20:02
В данных были неверные даты. Я обновил схему, см. здесь: sqlfiddle.com/#!2/7fd799/10 /0
 – 
Donal
18 Авг 2014 в 20:02

Вы должны изменить ваше ВНУТРЕННЕЕ СОЕДИНЕНИЕ для таблицы заданий на ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ, чтобы они выбирались независимо от того, существуют они в таблице заданий или нет.

1
Ed Brissenden 18 Авг 2014 в 20:03
LEFT JOIN и LEFT OUTER JOIN являются синонимами... но здесь проблема не в этом.
 – 
John Ruddell
18 Авг 2014 в 19:57
В примере пользователя использовалось ВНУТРЕННЕЕ СОЕДИНЕНИЕ, которое я предложил заменить на ЛЕВОЕ СОЕДИНЕНИЕ.
 – 
Ed Brissenden
18 Авг 2014 в 20:06
Нет, я понимаю, что ... если вы посмотрите на данные, левое соединение не будет иметь большого значения, если вы не укажете NOT NULL в выборе, как в другом ответе ... потому что есть нулевое значение для job_id и пустая строка для job_id в таблице избранного
 – 
John Ruddell
18 Авг 2014 в 20:07