选择查询不适用于何处

时间:2015-01-17 15:32:24

标签: php mysql

我有两张桌子

一个表是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

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

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

我的查询是

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

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

1 个答案:

答案 0 :(得分:1)

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

你应该有一个联结表,每id一行info_id和<{p}}。

也就是说,有时候我们会遇到不合规格的数据结构。 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无法利用索引之类的东西来提高此类查询的性能。