繁体   English   中英

连接MySQL表并比较列以列出数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM