【问题标题】:Select Query not work with where in选择查询不适用于 where in
【发布时间】:2015-01-18 00:05:34
【问题描述】:

我有两张桌子

一个表是alldata(这里info_id是使用php插入的文本字段数据)

=================
id  |   info_id
=================
1   |    2, 3, 5, 9
2   |
=================


second table is info
=================
id  |   name
=================
1   |    one
2   |    two
3   |    three
4   |    four
5   |    five
6   |    six
7   |    seven
9   |    eight
9   |    nine

=================

现在我想从表二中选择数据列表,其中数据 id 将与表一的第一项 info_id 数据匹配

我的查询是

SELECT i.* FROM `info` as i,`alldata` as a where  i.id IN(a.info_id) and a.id=1

我的查询有效,但只从表 2 中选择一项。但有多个匹配项。

【问题讨论】:

  • 将外键存储为逗号分隔是非常糟糕的数据库设计。重新设计你的表结构。
  • and a.id = 1 - 确定有id = 1的多条记录?

标签: php mysql


【解决方案1】:

你有一个非常糟糕的数据库设计。首先,将数字 id 存储为字符串是一个坏主意——数字应该存储为数字。其次,SQL 为存储列表提供了这种出色的数据结构。它被称为 table,而不是字符串。

你真的应该有一个联结表,每个idinfo_id 一行。

也就是说,有时我们会对不合标准的数据结构感到震惊。 MySQL 对此提供支持。您可以使用:

SELECT i.*
FROM `info` i JOIN
     `alldata` a 
     ON FIND_IN_SET(i.id, REPLACE(a.info_id, ', ', ',') ) > 0
WHERE a.id = 1;

您还应该学会使用正确、明确的join 语法。如果你使用这种方法,而不是修复数据库设计,你就不能抱怨性能。 MySQL 无法利用索引之类的东西来提高此类查询的性能。

【讨论】:

    猜你喜欢
    • 2016-11-06
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    相关资源
    最近更新 更多