[英]Joining MySQL tables and comparing columns to list data
我一直在寻找提取所需数据的正确方法。 我将MySQL与PHP结合使用,并将数据放入列表格式。 我唯一的问题是实际查询本身。 这是设置数据库的方式:
我有一个'chars'表,用于具有'id','descrip'和'class'列的特征。
我有一个带有表“ animal_id”,“ charlist”,...的“动物”表。
在“字符”中,id是递增的int,“描述”和“类”是文本/字符串。
每行的“ id”和“ decrip”不同,但“ class”相同,有时具有“ habitat”,“ size”,“ diet”等值。
我要的是一个清单,看起来像这样:
这是我开始遇到麻烦的地方。 在“详细信息”页面上,我将显示特定于某种动物的所有数据(无论单击哪个),并引用每种动物在数据库中具有其自己的“字符列表”值的“特征”。 该值是引用“字符”表的数字字符串,例如“ 2,55,67,90,122”。
因此,我已将所有(特定的)动物数据提取到我想提供信息的页面上的php变量中。 现在,我需要使用该动物的“ charlist”数据来查找并列出与该动物有关的特征。
我的查询看起来像这样,我知道我要离开了:
选择*从'chars'左内联接'animals'在chars.id IN(animals.charlist)上...
我尝试了很多不同的方法,这就是我迷路的地方。 我的大脑告诉我要加入表格,找到字符列表WHERE animal.animal_id = mysql_real_escape_string($ animal_id)中的数字-当然,MySQL告诉我我不能这样做。
我知道,对于列表的标题,我可能必须使用GROUP BY条件来执行此操作。
对查询和查询语法的任何帮助都将非常有用。 我是MySQL的新手,我非常高兴并渴望学习如何正确执行此操作。
谢谢阅读。
a IN ( x )
,如果(且仅当)返回true, a
相当于x
。
如果x
是一个字符串(甚至是一个用逗号分隔的字符串),则仅当a
等于同一字符串时 ,该语句才为true。 也就是说, 123 IN ('123,456,789')
为假。 请注意,这与传递多个参数(例如123 IN (123, 456, 789)
。
在MySQL中, 可以改用FIND_IN_SET()
,该字符串期望用逗号分隔的字符串。 但是,将定界列表存储在数据库列中确实不是一个好主意 。 您应该定义第三个关系表,在其中将外键存储到两个现有表中: (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)
;
然后,您可以执行以下操作:
SELECT *
FROM animals
JOIN animal_characteristics USING (animal_id)
JOIN chars ON chars.id = animal_characteristics.characteristic_id
WHERE ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.