2009-12-06 68 views
1

我想做一个查询使用我可以检查我为一个新的视频条目制作的URL不存在于我的数据库。MYSQL:友好的网址sql查询

我当前的查询是:

SELECT Count(videoid) FROM video WHERE titleurl = 'test'; 

我在一个变量$n存储计数使用下面的PHP代码

if ($n > 0){ 
    return $output . "-$n"; 
}else{ 
    return $output; 
} 

但上面的查询是创建一个问题,然后检查它。假设

  • 1用户提交的名称为Test视频这样的URL将被http://example.com/video/test/
  • 第二用户提交的名称为Test视频这样的URL将被http://example.com/video/test-1/因为一个入口与titleurl test已经存在,所以我已添加1,其中将是test-1
  • 第3位用户还添加了一个名为test的视频条目,但这次根据我的方法url将是test-1这是错误的。

我想解决这个问题,如果test已经存在,那么它应该是test-1,如果另一个用户创建与名测试条目,然后URL应该是test-2因为测试和test-1已经存在。

请给我一些方法,我可以解决这个问题。

+2

'SELECT Count(videoid)FROM video WHERE titleurl LIKE'test-%'OR titleurl ='test';',但是它也与测试我等相匹配。 – chronos 2009-12-06 14:35:56

回答

5

友好的网址很不错,但是您应该始终添加对象ID,或者在数据库中存储唯一的字符串。例如,在stackoverflow中检查这里的url。

编辑 我严重怀疑谷歌可以用短号码,但不喜欢长号码。下面是使用数字只有在那里你必须解决:添加另一列拿着每个测试视频的“身份证”的价值和对和titleurl创建唯一索引:

ALTER TABLE video ADD COLUMN titleurl_id UNSIGNED TINYINT NOT NULL; 
CREATE UNIQUE INDEX uidx_url ON video (titleurl, titleurl_id); 

当创建一个视频,你需要添加值:

$amount = query("SELECT COUNT(*) FROM video WHERE titleurl='test'"); 
query("INSERT INTO video(titleurl, titleurl_id) VALUES ('test', $amount + 1)"); 

你需要注意你的插入查询的结果,你可能会,如果你做这种方式遇到竞争条件(这就是为什么ID在URL更方便)。创建一个URL:

$urlpart = query(" 
    SELECT IF(
     titleurl_id = 0, 
     titleurl, 
     CONCAT_WS('-', titleurl, titleurl_id) 
    ) AS url FROM video"); 
+0

我正在考虑让网址变得像“ - ”'test-20345',但我的老年人说,添加网址id会在搜索引擎优化中产生问题,谷歌不喜欢这种长号码的网址。我该怎么办? – Prashant 2009-12-06 14:50:41

+0

我想我必须在SQL查询中使用'LIKE'。 – Prashant 2009-12-06 14:51:13

+4

@Prashant:询问你的前辈他们的发言基础是什么严肃的证据。 – Gumbo 2009-12-06 14:56:23

0

我最初的想法是选择与测试... WHERE url LIKE 'test%'开头的所有网址,然后检查是否存在test - 如果是的话,加-1并再次检查是否存在test-1。如果是,请将计数器增加到-2 ..

+0

同意@时间评论,它也将是一个递归类型的方法,它可能会产生问题,并可能放慢进程。 – Prashant 2009-12-06 14:38:48

+0

第二个想法是,如果您执行'LIKE-%OR ='-query,并将所有结果放入数组中,然后迭代该数组以寻找test-%d - 那么_might_可以成为解决方案。不是一个完美的,但相对较快,除非你有成千上万的URL匹配'LIKE'查询...... – chronos 2009-12-06 14:43:16

0

尝试创建两个字段 - 一个用于原始网址,另一个用于“计算”网址。

$c = SELECT COUNT(*) FROM table WHERE original_url = 'test' 
UPDATE table SET url='test-$c' WHERE id=...