访问的 url:
http://www.xxx.com/list.php?tag=1
数据库中有个 tag 的字段
存的数据都是( 1 , 2 , 3 ),( 2 , 22 , 44 ),( 1 , 22 , 11 ),( 1 ),( 1 , 23 )( 22 , 33 )。
这个是六条数据,没有括号。
我想获取数据中有 1 的那个文章,把他查询出来。
我想到的方法
SELECT * FROM article WHERE tags like "%1%";(这个是程序现在用的方法,有 bug )
SELECT * FROM article WHERE find_in_set('1', tags);(这个不行,我在想有没有函数可以解决)
有没有类似于
SELECT * FROM article WHERE id=1
SELECT * FROM article WHERE id in (1,2,3,4)
类似的 SQL 语句。
这个功能就类似于 Wordpress 的那个标签。
感觉数据库设计的不是很合理,我在想要不要重新建一个表弄下,但是已经有数据了。
1
Fedor 2016-01-14 12:15:06 +08:00
find_in_set 怎么不行?
|
2
chishi 2016-01-14 12:30:40 +08:00
SELECT * FROM article WHERE FIND_IN_SET('1', tags)
|
3
yangqi 2016-01-14 12:35:04 +08:00
tag 字段什么格式啊?字符串的话应该不能直接查,能得话效率也不会高的。数据量不大还是重新设计下
|
4
chaegumi 2016-01-14 12:36:45 +08:00
select * from article where instr(CONCAT(',', tags, ','), ',1,')>0
|
5
zeraba 2016-01-14 12:42:17 +08:00 via Android
|
6
gdtv 2016-01-14 12:43:54 +08:00
存数据的时候改成
存的数据都是(, 1 , 2 , 3 ,),(, 2 , 22 , 44 ,),(, 1 , 22 , 11 ,),(, 1 ,),(, 1 , 23 ,)(, 22 , 33 ,) 查询的时候用 SELECT * FROM article WHERE tags like "%,1,%"; |
7
lyz1990 2016-01-14 13:19:46 +08:00
还好我们的 tag 都是存在 post_tag 表里的, 蛤蛤~
|
9
jayki 2016-01-14 13:28:57 +08:00
数据不多的话,还是重新设计一下表吧。如果要查询数据库中同时有 1 和 2 的文章,成本好高。
|
10
zi 2016-01-14 13:36:44 +08:00
SELECT * FROM article WHERE find_in_set('1', tags)<>0;
find_in_set 返回的是查找字符在字符串的位置 |
11
wd0g 2016-01-14 13:40:14 +08:00
新做一个关系表呗,
文章 ID,标签 ID select * from guanxi where tagId = 1 or tagId = 2 在通过查询的记录把文章查出来 不知道可不可以 |
12
cevincheung 2016-01-14 14:14:56 +08:00
重新建标,新的数据扔新表,旧的数据慢慢导过去……
|
15
nikubenki 2016-01-14 21:24:38 +08:00
不满足第一范式
|