加入MySQL表并将列与列表数据进行比较

时间:2013-12-15 11:05:41

标签: php mysql join group-by

我一直在努力寻找提取所需数据的正确方法。我正在使用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很陌生,我很高兴并且非常乐意学习如何做到这一点。

感谢阅读。

1 个答案:

答案 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)
;