从MYSQL获取数据时如何从逗号分隔数组中获取单个值

时间:2015-08-11 20:44:12

标签: php mysql

我在数据库中输入数据如下:

ID | Name | Email   | Place
1  | Khan | abc@... | Page1, Page2, Page10

现在我正在获取这样的数据:

$conn = mysqli_connect($servername, $username, $password, $dbname);
$sql = "SELECT * FROM story Where Place='Page2' Limit 1";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_assoc($result);

但不幸的是它没有告诉我任何事情:(

我以逗号分隔的形式上传此Place行,现在我希望它向我显示我选择放置的数据。

2 个答案:

答案 0 :(得分:3)

请考虑规范化您的数据。 Is storing a delimited list in a database column really that bad?如果你的应用程序实际增长,你在这里的设计会让你发疯。

与此同时,您希望使用column LIKE '%value%'代替column = 'value'。注意:这种查询的性能非常差,无法改进。

编辑使用column = 'value'甚至column LIKE 'value%'的查询可以利用数据库管理系统中的索引。可以在O(log(n))时间内查找索引中的值。这样就可以有效地访问数十亿行的大桌子。但是,包含column LIKE '%value%'的查询必须在O(n)时间内逐行扫描所有数据,详尽地查找匹配项。如果你有几百行,你就不会注意到这种糟糕的表现。但如果你的桌子增长,你肯定会感到抱歉。

尝试此查询。

     SELECT * 
       FROM table
      WHERE column LIKE CONCAT('%' , 'Page2', '%')
      LIMIT 1

我建议使用CONCAT(),以便可以轻松修改查询以使用绑定参数。例如,CONCAT('%' ,? , '%')

另一个编辑。如果你有Page1, Page100, Page101,你会在Page1上收到很多误报。 In MySQL FIND_IN_SET()可以搜索以逗号分隔的字符串。

     SELECT * 
       FROM table
      WHERE FIND_IN_SET('Page2', column) <> 0
      LIMIT 1

如果您的逗号后面有空格,则无效。 Page1,Page2,Page3很好,但Page1, Page2, Page3并不好。我们可以修补这个问题。

     SELECT * 
       FROM table
      WHERE FIND_IN_SET('Page2', REPLACE(column, ', ', ',')) <> 0
      LIMIT 1

但现在情况已经失控。如果你在逗号之后有两个空格怎么办?还是三个?

这也是一种不可优化的搜索。

答案 1 :(得分:1)

迈向数据规范化。

建议的联结表(根除Place CSV列):

create table story_place_jnc
(   -- one row per story/place combo
    id int auto_increment primary key,
    storyId int not null,
    place varchar(20) not null  -- you size this thing

    -- perhaps 2 FK's go here (1 to story, 1 to place):

    -- Unique composite key on (storyId,place):
);

正如Patsy在Monty Python的圣杯中所说,&#34;它只是一个模特。&#34;

谁知道你是否有place表:&gt;