喜欢只选择确切的关键字

时间:2015-05-16 12:07:23

标签: php mysql sql-like

是否可以选择逗号分隔列中的确切单词?

标签:php,web,webdevelopment,java,javascript

'SELECT * FROM table WHERE tags LIKE "%java%"'

这将选择“java”和“javascript”

是否可以只选择“java”?

感谢。

5 个答案:

答案 0 :(得分:2)

您可以{/ 3}}使用

select * from your_table
where find_in_set('java', tags) > 0

但实际上你应该改变你的表定义。切勿在一列中存储多个值。

更好的数据库设计

posts table
-----------
id
title
body
...


tags table
----------
id
name
...


post_tags table
---------------
post_id
tag_id

然后,您可以查询具有java标签的帖子,例如

select p.*
from posts p
join post_tags pt on pt.post_id = p.id
join tags t on pt.tag_id = t.id
where t.name = 'java'

更清洁,更容易,也更快。

答案 1 :(得分:1)

MySql支持regular expressions,正则表达式支持字边界:

SELECT * FROM table WHERE tags REGEXP '[[:<:]]java[[:>:]]';

答案 2 :(得分:1)

首先,您应该将标记存储在联结表中,每个标记和每个标记都有一行。这是在SQL中存储列表的正确方法。

另一个答案显示了如何使用find_in_set()。如果您热衷于使用like,则可以执行以下操作:

WHERE CONCAT(',', tags, ',') LIKE "%,java,%"'

虽然性能应与MySQL中的find_in_set()类似,但此方法的唯一优势是它可以在更多数据库中使用。但是,让我重复一遍,正确的做法是修复数据结构以建立联结表,而不是将列表存储在字符串列中。

答案 3 :(得分:1)

1NF:每个属性的域仅包含原子值。 重新设计您的表以支持1NF。 编辑:当您想要更新列时,您认为会发生什么?或者你想从表中删除java?当遵循规范化规则时,访问,删除和更新行要容易得多。

答案 4 :(得分:0)

在我之前给出的另一个答案是好的,但我有另一个我想分享的解决方案。

SELECT * FROM table WHERE tags  LIKE "java" OR tags   LIKE "%,java," OR tags   LIKE "java,%"

这意味着列中可以有4个条件:
tags列只有java在其中 标签列可能有,java,在其中 tags列只有java,在其中

有用的链接:http://www.w3schools.com/sql/sql_like.asp

我希望这会对你有所帮助。