我的表格newsarchive
中有一个tags
列,我可以在其中输入以逗号分隔的多个值。我有一个页面,其中将显示与newsarchive.tags
指定的标签匹配的新闻。页面中的标签也可以有多个值。
现在我想获取与newsarchive.tags
页面中的标记匹配的记录。是否有SQL语句来实现结果?
CREATE TABLE newsarchive (
newsid int(11) NOT NULL auto_increment,
headline text NOT NULL,
article text NOT NULL,
pdate date NOT NULL default '0000-00-00',
tags text NOT NULL,
PRIMARY KEY (newsid) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=107 ;
newsarchive.tags of record#1="Nepal, Everest, Kathmandu"
newsarchive.tags of record#2="Kathmandu,Pokhara"
newsarchive.tags of record#3="Everest,Pokhara"
tags(in page)="Nepal, Kathmandu"
record#1
record#2
我使用SELECT
语句IN
作为
SELECT * FROM newsarchive WHERE tags IN ('Nepal','Kathmandu') ORDER BY postdate;
如果首先显示匹配最多标签的记录,我将很高兴。
答案 0 :(得分:0)
使用where tags in
对您的方案无效。
最好的方法是将这些标记放入通过外键链接到记录的相关表中。
如果您无法更改架构并且无法使用支持它的RDBMS系统,那么您需要查看MySQL上的full text searching或(SQL Server link here)以便搜索分隔字符串。
在全文之外,您必须通过分隔符(在本例中为逗号)拆分字符串,并通过临时表,表变量或其他方式单独搜索它们。我已经看到xml approaches在SQL Server上搜索遵循粗略概念的分隔字符串。
在MySQL上,您可能需要编写自己的string splitting function。阅读对链接问题的回复,以查看在MySQL中拆分的示例方法。
如果必须在单个列中存储多值数据(不推荐),那么通常XML比分隔字符串更好。 MySQL为xpath查询等提供了一些支持。
答案 1 :(得分:0)
您的数据结构不佳。你应该有一个像这样的表:
CREATE TABLE newstags (
newstagsid int(11) NOT NULL auto_increment,
newsid int(11) not null,
tag text not null
PRIMARY KEY (newstagsid)
)
每个故事都有一个标签。更好的结构是将标记存储在单独的表中,并在此使用tagid
而不是tag
。
但你没有那个。你能做什么?您可以解析在php中使用输入的标签。然后使用以下条件构造SQL语句:
(concat(',', tags, ',') like concat('%,', USERTAGS1, '%,') or
concat(',', tags, ',') like concat('%,', USERTAGS2, '%,') or
. . .
concat(',', tags, ',') like concat('%,', USERTAGSn, '%,')
)
另一种方法是在标签上构建全文索引,然后使用contains
。