如何在 JOINED table 中使用 FIND_IN_SET?

How can I use FIND_IN_SET within a JOINED table?

我有 2 个表:

我必须建立一个搜索表单来检索潜在的献血者。该表格允许用户搜索特定的血型捐献者。如果我搜索血型 5 (A-),查询应该 return 所有拥有 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 记录也应显示,因为血液 id 5 的 receive 列包含 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 中的表结构。

您需要将 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;

但是,您确实应该有一个单独的 table,每个血型和可以接收的每种类型各占一行。这称为 连接点 table。以逗号分隔的字符串存储列表不是 SQL 的处理方式:table 是。

编辑:

像这样:

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;