LEFT OUTER JOIN mysql - почему-то не работает запрос

150
23 апреля 2022, 05:50

Пытаюсь составить запрос в бд mysql. В бд есть таблицы label_person (метки) и answers (ответы). И таблица people (люди), к которой они относятся.

У Людей (конкретно одного человека) может не быть записей в таблицах Ответы и Метки. Мне же нужно получить все данные, а если Ответа или Метки нет - оставить поле пустым.

Составил запрос, выполняю - пусто, не возвращает ни одной строчки. Если удалить из запроса таблицу label_person, то всё работает. Что я делаю не так?

SELECT
  CONCAT(prefixes.name, samples.number) AS sample_number,
  CONCAT(genes.name, polfzms.name) AS polfzm,
  CONCAT(alleles.name, '/', alleles_1.name) AS allelic_variant,
  questions.text,
  answers.value,
  people.surname,
  people.first_name,
  people.middle_name,
  people.birth_date,
  people.gender,
  people.id AS person_id,
  labels.name AS label_name
FROM samples
  INNER JOIN prefixes
    ON samples.prefix_id = prefixes.id
  INNER JOIN providers
    ON samples.provider_id = providers.id
  INNER JOIN polfzm_sample
    ON polfzm_sample.sample_id = samples.id
  INNER JOIN polfzms
    ON polfzm_sample.polfzm_id = polfzms.id
  INNER JOIN genes
    ON polfzms.gene_id = genes.id
  INNER JOIN genotypes
    ON polfzm_sample.genotype_id = genotypes.id
  INNER JOIN alleles
    ON genotypes.l_allele_id = alleles.id
  INNER JOIN alleles alleles_1
    ON genotypes.r_allele_id = alleles_1.id
  INNER JOIN people
    ON samples.person_id = people.id
  LEFT OUTER JOIN answers
    ON answers.person_id = people.id
  INNER JOIN questions
    ON answers.question_id = questions.id
  LEFT OUTER JOIN label_person
    ON label_person.person_id = people.id
  INNER JOIN labels
    ON label_person.label_id = labels.id
WHERE label_person.label_id IN (5)
GROUP BY CONCAT(prefixes.name, samples.number),
         CONCAT(genes.name, polfzms.name),
         CONCAT(alleles.name, '/', alleles_1.name),
         questions.text,
         answers.value,
         people.surname,
         people.first_name,
         people.middle_name,
         people.birth_date,
         people.gender,
         people.id,
         labels.name
Answer 1

Нужно условие по label_person переместить в ON (так как в WHERE он превращает связь фактически в INNER JOIN), а также заменить INNER JOIN labels на LEFT OUTER JOIN labels (поскольку вы идете к ним через LEFT OUTER).

SELECT
  CONCAT(prefixes.name, samples.number) AS sample_number,
  CONCAT(genes.name, polfzms.name) AS polfzm,
  CONCAT(alleles.name, '/', alleles_1.name) AS allelic_variant,
  people.surname,
  people.first_name,
  people.middle_name,
  people.birth_date,
  people.gender,
  people.id AS person_id,
  labels.name
FROM samples
  INNER JOIN prefixes
    ON samples.prefix_id = prefixes.id
  INNER JOIN providers
    ON samples.provider_id = providers.id
  INNER JOIN polfzm_sample
    ON polfzm_sample.sample_id = samples.id
  INNER JOIN polfzms
    ON polfzm_sample.polfzm_id = polfzms.id
  INNER JOIN genes
    ON polfzms.gene_id = genes.id
  INNER JOIN genotypes
    ON polfzm_sample.genotype_id = genotypes.id
  INNER JOIN alleles
    ON genotypes.l_allele_id = alleles.id
  INNER JOIN alleles alleles_1
    ON genotypes.r_allele_id = alleles_1.id
  INNER JOIN people
    ON samples.person_id = people.id
  LEFT OUTER JOIN label_person
    ON label_person.person_id = people.id
    AND label_person.label_id IN (5)
  LEFT OUTER JOIN labels
    ON label_person.label_id = labels.id
GROUP BY CONCAT(prefixes.name, samples.number),
         CONCAT(genes.name, polfzms.name),
         CONCAT(alleles.name, '/', alleles_1.name),
         people.surname,
         people.first_name,
         people.middle_name,
         people.birth_date,
         people.gender,
         people.id,
         labels.name
READ ALSO
Помогите сделать условие проверки существования таблицы перед импортом Ansible

Помогите сделать условие проверки существования таблицы перед импортом Ansible

Имеется такая команда в ansible, которая импортирует в базу mysql какие-то таблицыПомогите сделать условие проверки существования таблицы перед...

91
инсталлятор для программы, работающий с СУБД MySQL

инсталлятор для программы, работающий с СУБД MySQL

Программа разработана в visual studio С# она работает с СУБД MySQLКак при помощи Setup Project создать инсталятор который кроме самой программы устанавливал...

157
Получение списка уникальных диалогов между пользователями, в MySQL

Получение списка уникальных диалогов между пользователями, в MySQL

Имеется таблица переписки между пользователями такого типа

193
Как выбрать запись которой соответствует наибольшее значение в другой таблице?

Как выбрать запись которой соответствует наибольшее значение в другой таблице?

Пытаюсь реализовать запрос, в котором хочу вывести ФИО работника, который выполнил самое большое количество заказов (объектов)

208