2009-12-06 113 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=...