【问题标题】:Joining MySQL tables and comparing columns to list data连接 MySQL 表并比较列以列出数据
【发布时间】:2014-01-02 19:59:07
【问题描述】:

我一直在努力寻找正确的方法来提取我需要的数据。我将 MySQL 与 PHP 一起使用,并将数据放入列表格式。我唯一的问题是实际查询本身。以下是数据库的设置方式:

我有一个 'chars' 表,其中包含 'id'、'descrip' 和 'class' 列的特征。

我有一个 'animal' 表,其中包含 'animal_id'、'charlist' 等列...

在 'chars' 中,id 是递增的 int,'descrip' 和 'class' 是文本/字符串。

'id' 和 'descrip' 对于每一行都是不同的,但 'class' 有时会是相同的,它们具有像 'habitat'、'size'、'diet' 等的值。

我想要的是一个如下所示的列表:

    栖息地
  • 地下
  • 北极
    饮食
  • 昆虫
  • 杂食动物

这就是我开始遇到麻烦的地方。在“详细信息”页面上,我显示了特定于某种动物的所有数据(无论单击哪个),并引用每个动物在数据库中具有自己的“charlist”值的“特征”。此值是引用“chars”表的数字字符串,例如“2,55,67,90,122”。

因此,我已将所有(特定)动物数据提取到页面上的一个 php 变量中,我想提供这些信息。现在我需要使用该动物的“charlist”数据来查找并列出与该动物相关的特征。

我的查询看起来像这样,我知道我已经离开了:

SELECT * FROM 'chars' LEFT INNER JOIN 'animals' ON chars.id IN (animals.charlist) WHERE ...

我尝试了很多不同的方法,这就是我迷路的地方。我的大脑告诉我加入表格,找到字符列表中的数字 WHERE animal.animal_id = mysql_real_escape_string($animal_id) - 当然 MySQL 告诉我我不能这样做。

我知道对于列表的标题,我可能必须使用 GROUP BY 条件来执行此操作。

查询和查询语法的任何帮助都会很棒。我对 MySQL 还很陌生,我很高兴也很想学习如何正确地做到这一点。

感谢阅读。

【问题讨论】:

    标签: php mysql join group-by


    【解决方案1】:

    <strong><em>a</em></strong> IN (<strong><em>x</em></strong>) 当(且仅当)a 等于 x 时返回 true。

    如果 x 是一个字符串(即使是由逗号分隔的字符串),那么只有在 a 等于 相同的字符串。也就是说,123 IN ('123,456,789') 是假的。请注意,这与传递多个参数(例如 123 IN (123, 456, 789))不同。

    在 MySQL 中,可以改用FIND_IN_SET(),它需要一个用逗号分隔的字符串。但是,在数据库列中存储分隔列表是a really bad idea。相反,您应该定义第三个关系表,在其中将外键存储到两个现有表中:(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  ...
    

    【讨论】:

    • 这非常有用且内容丰富。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2022-01-16
    • 2014-02-03
    • 2021-09-17
    • 2019-06-26
    相关资源
    最近更新 更多