Как я могу использовать 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;