只喜欢 select 确切的关键字

LIKE to select only the exact keyword

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

标签:php、网络、网络开发、java、java脚本

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

这将 select "java" 和 "javascript"

是否可以 select 仅 "java"?

谢谢。

你可以使用 FIND_IN_SET

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

但实际上您应该更改 table 定义。切勿在单个列中存储多个值。

更好的数据库设计是

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'

那更干净、更容易,也非常快。

摆在我面前的另一个答案很好,但我有另一个解决方案,我想分享一下。

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

这只是意味着该列中可以有 4 个条件:
tags 列中只有 java
tags 列可能有 ,java, in it
tags 列只有 java, in it

有用link:http://www.w3schools.com/sql/sql_like.asp

希望对您有所帮助。

MySql支持regular expressions,正则表达式支持分词:

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

首先,您应该将标签存储在联结点 table 中,每个标签一行。这是在 SQL.

中存储列表的正确方法

另一个答案显示了如何使用 find_in_set()。如果你热衷于使用 like,你可以这样做:

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

虽然性能应该和MySQL中的find_in_set()差不多,但这种方法唯一的优点是它可以在更多的数据库中工作。不过,让我重复一遍,正确的做法是修复数据结构以具有连接 table 而不是将列表存储在字符串列中。

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