2012-05-22 20 views
1
id title cat lang 
6101 AAba 1 1 
6102 AAad 4 2 
6103 AAaf 4 2 
6104 AAa 1 1 
6105 AAtar 4 2 
6106 AAao 1 1 
6107 ABya 4 2 
6108 ABar 4 2 
6109 ACar 1 2 
6110 BCad 3 1 
6111 CCas 4 1 
6112 DCas 4 2 
6113 GCaz 2 2 
6114 FCaew 2 2 
6115 FCaw3 4 2 
6116 FCa3 1 1 
6117 FCa4 4 2 
6118 FCa5 2 1 
6119 FCa6 4 2 --- last id 

表消息以後,ID是主鍵,標題 - 是標題字段, 貓 - 有四種類型的消息類別,朗 - 語言代碼1或2。選擇N行之前和給定行與條件

我想實現如下: 1)案例編輯新聞 - ID是可用 - 例如6111,lang是1,貓是4 我想收集這些ID和標題:

6119 
6117 
6115 
6112 
6109 
6105 
6103 
6102 

它們是相反的語言 - lang是2中,相同類別貓是4和內的4(或n)之前ID範圍 和給定id 6111 還命令降序

2)情況後添加新聞 - ID不可用,或者在PHP插件mysql_insert_id() 相同的功能之後 - 去年10 ID與同貓= 4,相反LANG = 2

到目前爲止,我已經試過這樣:

爲案例1)PHP代碼片段:

$id = 6111; 
    $lang = 1; 
    $tip = 4; 
    $sql = "SELECT id, title 
      FROM pubs 
      WHERE id BETWEEN ".($id-4)." AND ".($id+4). " AND 
      tip = ".$tip." AND 
      lang <> ".$lang." 
      ORDER BY id DESC "; 

但是這得到4個id前後id,而不是從我需要的id集合。

的情況下2)

$sql = "SELECT id, title 
     FROM news 
     WHERE cat = 4 AND 
     lang <> 1 
     ORDER BY id DESC LIMIT 10"; 

這似乎是工作,但可能是我錯了。

有沒有辦法用php和mysql來實現案例1? 案例2更好的方法?

回答

2

鑑於你只有$id,這可怕的外觀是最好的,我可以拿出。我相當肯定有一個整潔的方式做到這一點,但我覺得將工作(固定

$id = 6111; 

$query = " 
    SELECT `id`, `title` 
    FROM `news` 
    WHERE `id` IN (
    SELECT * FROM (
     SELECT `id` 
     FROM `news` 
     WHERE `cat` = (
     SELECT `cat` 
     FROM `news` 
     WHERE `id` = ".$id." 
    ) AND `lang` != (
     SELECT `lang` 
     FROM `news` 
     WHERE `id` = ".$id." 
    ) AND `id` < ".$id." 
     ORDER BY `id` DESC 
     LIMIT 4 
    ) `lower` 
) OR `id` IN (
    SELECT * FROM (
     SELECT `id` 
     FROM `news` 
     WHERE `cat` = (
     SELECT `cat` 
     FROM `news` 
     WHERE `id` = ".$id." 
    ) AND `lang` != (
     SELECT `lang` 
     FROM `news` 
     WHERE `id` = ".$id." 
    ) AND `id` > ".$id." 
     ORDER BY `id` ASC 
     LIMIT 4 
    ) `upper` 
) 
    ORDER BY `id` DESC 
"; 
+0

+1醜陋,但更可能是正確的:P – mellamokb

+0

@mellamokb令人難以置信的醜陋,我確信有一個更有效的方法來做到這一點,但現在我不能爲我的生活弄清楚如何。至少不是在單個查詢中,我想可以將最內部查詢的結果緩存在變量中,但我懷疑額外的數據庫流量會抵消增益。 – DaveRandom

+1

大聲笑,從來沒有見過這個錯誤:「這個版本的MySQL還不支持'LIMIT&IN/ALL/ANY/SOME子查詢':http://www.sqlfiddle.com/#!2/dabe3/1 – mellamokb

-1

像這樣的東西可能會奏效:

$sql = "SELECT id, title FROM pubs 
     WHERE tip = ".$tip." AND lang <> ".$lang." 
     ORDER BY id DESC 
     LIMIT ".($id-4).",".($id+4); 

有可能是一個更好的解決方案,但是這能夠完成任務。

+0

'LIMIT 6107,6115'(例如)會搶了'6115'行以下第6107行。我不認爲這解決了OP的問題。 – mellamokb

+0

好吧,我想到了這一點,但$ id不會改變爲選擇id - 它保持不變。 @Connor – user1408669

+0

@mellamokb - 這個想法是在6111之前和之後得到4行,但是其中id不是隨後的值 – user1408669