0

我有一个表格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语句与INas一起使用

SELECT * FROM newsarchive WHERE tags IN ('Nepal','Kathmandu') ORDER BY postdate;

笔记:

如果标签匹配最多的记录首先出现,我会很高兴。

4

2 回答 2

0

使用where tags in不适用于您的场景。

最好的方法是将这些标签放入通过外键链接到记录的相关表中。

如果您无法更改架构并且您使用支持它的 RDBMS 系统,您将需要查看MySQL 上的全文搜索或(此处的 SQL Server 链接)以搜索该分隔字符串。

在全文之外,您必须通过分隔符(在本例中为逗号)拆分字符串,并通过临时表、表变量或其他方式单独搜索它们。我已经看到了在 SQL Server 上搜索遵循该粗略概念的分隔字符串的xml 方法。

在 MySQL 上,您可能必须编写自己的字符串拆分函数。通读对链接问题的回复,以查看在 MySQL 中拆分的示例方法。

如果您必须将多值数据存储在单个列中(不推荐),那么通常 XML 是比分隔字符串更好的方法。MySQL 为 xpath 查询等提供了一些支持。

于 2013-03-29T16:19:42.693 回答
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.ini中输入的标签。然后构造一条 SQL 语句,条件如下:

(concat(',', tags, ',') like concat('%,', USERTAGS1, '%,') or
 concat(',', tags, ',') like concat('%,', USERTAGS2, '%,') or
 . . .
 concat(',', tags, ',') like concat('%,', USERTAGSn, '%,')
)

另一种方法是在标签上建立全文索引,然后使用contains.

于 2013-03-29T17:05:15.453 回答