我一直在努力寻找提取所需数据的正确方法。我正在使用MySQL和PHP,并将数据放入列表格式。我唯一的问题是实际的查询本身。以下是数据库的设置方式:
我有一个'chars'表,其中包含列'id','descrip'和'class'的特征。
我有一个'动物'表,其中包含'animal_id','charlist',......
列在'chars'id中是增加的int,'descrip'和'class'是文本/字符串。
'id'和'descrip'对于每一行都是不同的,但'class'有时会有一个像'habitat','size','diet'和et cetra这样的值。
我想要的是一个如下所示的列表:
这是我开始遇到麻烦的地方。在“详细信息”页面上,我显示特定于某个动物的所有数据(无论点击哪个),并引用每个动物在数据库中拥有自己的“charlist”值的“特征”。该值是一串引用'chars'表的数字,如'2,55,67,90,122'。
所以我把所有(特定)动物数据都拉到了我要提供信息的页面上的php变量中。现在我需要使用该动物的'charlist'数据来查找和列出与动物相关的特征。
我的查询看起来像这样,我知道我已经离开了:
SELECT * FROM'chars'LEFT INNER JOIN'nimals'ON chars.id IN(animals.charlist)WHERE ...
我尝试了很多不同的方法,这就是我迷路的地方。我的大脑告诉我加入表格,找到charlist中的数字WHERE animal.animal_id = mysql_real_escape_string($ animal_id) - 当然MySQL告诉我我不能这样做。
我知道对于列表的标题,我可能必须使用GROUP BY条件。
对查询和查询语法的任何帮助都会很棒。我对MySQL很陌生,我很高兴并且非常乐意学习如何做到这一点。
感谢阅读。
答案 0 :(得分:0)
a IN (x)
如果(且仅当) a
等于 x
强>
如果 x
是一个字符串(即使是逗号分隔的字符串),那么该语句只有在 {{ 1}} 等于相同的字符串。也就是说,a
是错误的。请注意,这与传递多个参数(例如123 IN ('123,456,789')
。
在MySQL中,一个可以而不是FIND_IN_SET()
,它需要一个逗号分隔的字符串。但是,在数据库列中存储分隔列表为a really bad idea。您应该定义第三个关系表,在该表中将外键存储到两个现有表中:123 IN (123, 456, 789)
:
(animal_id, characteristic_id)
然后你可以这样做:
CREATE TABLE animal_characteristics (
PRIMARY KEY (animal_id, characteristic_id),
FOREIGN KEY (animal_id) REFERENCES animal (animal_id),
FOREIGN KEY (characteristic_id) REFERENCES chars (id)
) SELECT animal.animal_id, chars.id AS characteristic_id
FROM animal JOIN chars ON FIND_IN_SET(chars.id, animal.charlist)
;