0

我有 2 张桌子:

  • 用户:注册献血者的姓名及其血型。
  • 血液:包含血型和血液相容性。eg: Blood id 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中的表结构。

4

1 回答 1

3

您需要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;
于 2016-04-28T01:39:21.763 回答