Как я могу использовать FIND_IN_SET в таблице JOINED?

У меня есть 2 таблицы:

  • пользователь: имена зарегистрированных доноров крови с указанием их группы крови.
  • кровь: содержит группы крови и совместимость крови. Например: идентификатор крови 5 (A-) может принимать донорскую кровь от 5 (A-) и 6 (O-).

Я должен создать поисковую форму, которая получает потенциальных доноров крови. Форма позволяет пользователю искать доноров определенной группы крови. Если я ищу группу крови 5 (A-), запрос должен возвращать всех пользователей с 5 (A-) и 6 (O-) типами крови, а в результирующем списке должны отображаться как имя, так и группа крови каждого пользователя.,

Я пробовал следующее:

SELECT user.name, blood.name AS blood FROM user JOIN blood ON blood.id_blood = user.id_blood WHERE user.id_blood = 5

Это приводит только к другим пользователям, которые имеют точную группу крови, которая была найдена, но не все совместимые группы крови.

Затем я попробовал этот другой запрос. Будет выполнен поиск всех совместимых групп крови, но результаты также будут отфильтрованы по группе крови (записи группы крови 6 также должны отображаться, поскольку receive колонка крови id 5 содержит 5,6.)

SELECT user.name AS name, blood.name AS blood FROM user JOIN blood ON blood.id_blood = user.id_blood WHERE FIND_IN_SET(5, blood.receive)

... но по какой-то причине он не отображает правильные строки. Я вижу некоторые A+, AB+, A- записи, и там должны быть только A- и O- записи.

Вот структуры таблиц в jsfiddle.

1 ответ

Решение

Вам нужно поставить find_in_set() в ON пункт:

SELECT u.name AS name, b.name AS blood
FROM user u JOIN
     blood b
     ON FIND_IN_SET(u.id_blood, b.receive) > 0;

Однако у вас должна быть отдельная таблица с одной строкой на группу крови и каждый тип, который можно получить. Это называется соединительной таблицей. Хранение списков в разделенных запятыми строках - это не SQL-способ, а таблицы.

РЕДАКТИРОВАТЬ:

Как это:

SELECT u.name AS name, b.name AS blood
FROM user u JOIN
     blood b
     ON FIND_IN_SET(u.id_blood, b.receive) > 0
WHERE u.id_blood = 5;
Другие вопросы по тегам