如何在JOINED表中使用FIND_IN_SET?

时间:2016-04-28 01:36:02

标签: mysql sql join find-in-set

我有两张桌子:

  • 用户:已注册献血者的血型名称。
  • :包含血型和血液相容性。例如:血液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记录也应显示,因为血液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中的表格结构。

1 个答案:

答案 0 :(得分: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;