我在数据库中输入数据如下:
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
行,现在我希望它向我显示我选择放置的数据。
答案 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;