具有多个值的单列匹配多个值sql

时间:2013-03-29 16:05:41

标签: mysql sql tagging

我的表格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;

注意:

如果首先显示匹配最多标签的记录,我将很高兴。

2 个答案:

答案 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