我有两张桌子:
我必须建立一个搜索表格,让潜在的献血者退缩。该表格允许用户搜索特定血型捐赠者。如果我搜索血型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中的表格结构。
答案 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;