2013-06-05 64 views
1

我有一個這樣的數據庫:得到更新,舊帖子從MySQL,但至少一定數量

+------------+-------------+ 
| listed  | data  | 
+------------+-------------+ 
| 2013-01-01 | random text | 
| 2013-01-02 | random text | 
| 2013-01-03 | random text | 
| 2013-01-05 | random text | 
| 2013-01-06 | random text | 
| 2013-01-07 | random text | 
+------------+-------------+ 
在這種情況下,「數據」

是一個笑話的標題。我想在當前的笑話旁邊列出較舊的笑話和新的笑話。不是每天都有一個笑話。如果沒有較新的我只想老的和副詩句......

這樣:

for 2013-01-02 I want 2013-01-01 and 2013-01-03 
    for 2013-01-03 I want 2013-01-02 and 2013-01-05 
    for 2013-01-07 I want 2013-01-05 and 2013-01-06 
    for 2013-01-01 I want 2013-01-02 and 2013-01-03 

我可以在兩個查詢做到這一點,至少獲得2笑話的情況下,其他查詢不返回任何內容:

SELECT * FROM jokes WHERE listed>'$date' ORDER BY listed ASC limit 2 
SELECT * FROM jokes WHERE listed<'$date' ORDER BY listed DESC limit 2 

,然後做數學上的數組的長度,但我想知道是否有在單個查詢做到這一點正確的方法是什麼?

+0

您建議的方式(可以用'unioned'子查詢重寫爲一個查詢)很好。 – Strawberry

回答

1

檢查SQL Fiddle here.I已發佈解決方案,非常大的查詢。但我認爲有人可以減小其大小。

SELECT * FROM (SELECT 
    listed,DATA,@r2 := @r2 + 1 AS num 
FROM 
    jokes, 
    (SELECT @r2:=0) AS e) t WHERE FIND_IN_SET(num,(SELECT FOUND FROM (SELECT 
    listed,`data`,@rn := @rn + 1 AS number, 
    IF(listed = '2013-01-07',#pass your date here 
     IF(@rn = 1,CONCAT(2,',',3), 
      IF(@rn = (SELECT COUNT(*) FROM jokes),CONCAT(@rn-1,',',@rn-2),CONCAT(@rn-1,',',@rn+1))) ,-1) 
     AS `found` 
FROM jokes,(SELECT @rn := 0) r 

ORDER BY listed) AS k WHERE `found` != -1))>0 
相關問題