2014-12-19 51 views
2

我正在尋找一個解決方案;查詢是:在MYSQL ORDER BY使用條件返回一個函數

  SELECT MAX(forum_commenti.Data) AS MData, forum_post.id AS id, forum_post.Nome AS Nome, forum_post.Messaggio AS Messaggio, forum_post.Sezione AS Sezione, forum_post.Data AS Data, forum_post.Utente AS Utente, forum_post.Chiuso AS Chiuso, forum_post.Importante AS Importante 
      FROM forum_post LEFT OUTER JOIN forum_commenti ON forum_post.id = forum_commenti.Post 
      WHERE forum_post.Importante = 0 
      AND forum_post.Sezione = '".$_GET['id']."' 
      GROUP BY id, Nome, Messaggio, Sezione, Data, Utente, Chiuso, Importante 
      ORDER BY MData IS NOT NULL DESC, Data DESC 
      LIMIT $start, $per_page 

這是查詢論壇;我試圖顯示數據的帖子順序。我想要的是:

  • 如果帖子沒有回覆,請使用他自己的日期排序,或者使用該帖子的最後評論日期。 (其它信息是無用的)

我找了解決有關這樣的老問題,但它給了我問題時,我嘗試做這樣的:

ORDER BY MData IS NOT NULL DESC, Data ASC 

它說:「參考‘MDATA’不支持(參考組功能)「。

我爲php函數使用該查詢。

查詢中涉及的表是:

  • forum_post:包含論壇
  • forum_commenti的所有職位:包含所有帖子的所有回信,用「後」作爲forum_post的外鍵

WHERE條件是查詢的無用點。

我給你舉個例子:

POST 1 |最後回覆的數據是19/12/2014 10:00:00,發佈的數據是2014年12月19日09:00:00 TAKE最後評論的數據

POST 2 |最後回覆的數據是NULL(hasen't得到回覆),發佈的數據是19/12/2014 08:00:00 TAKE數據的帖子

....... ... .... 等

現在我有類似的東西:

POST 1 | 19/12/2014 10:00:00

POST 2 | 19/12/2014 08:00:00

ORDER BY Data

謝謝大家的幫助。

+0

不能使用類似於Oracle解碼的命令?如果現在採取最後的評論日期,否則採取發佈日期,給出相同的名稱,你可以通過它可能是 – 2014-12-19 08:04:31

+0

我正在尋找類似的東西。我嘗試使用'ORDER BY WHEN',但警告仍在;我不能使用MData,這是SELECT(MAX)中使用的聚合函數的返回值。 – Mauri 2014-12-19 08:06:47

+0

它不是那樣用的。做一個子查詢與if(http://stackoverflow.com/questions/4706100/mysql-equivalent-of-decode-function-in-oracle-and-intersystem-cache-database),但加載數據具有相同的名稱,而不是聚合,就像從數據desc限制1從myTable順序選擇數據,如果null採取的職位,等 – 2014-12-19 08:08:44

回答

1

它在使用首先選擇帖子以及最新評論的日期的子查詢時起作用。然後可以根據這兩列中的表達式對結果進行排序。我以前IFNULL(last_post_date, own_date)來選擇正確的日期,也使本可在教育方法目的的effective_date柱:

SELECT *, IFNULL(last_post_date, own_date) AS effective_date 
FROM (
    SELECT 
    forum_post.post_id, 
    forum_post.date AS own_date, 
    MAX(forum_comment.date) AS last_post_date 
    FROM forum_post 
    LEFT OUTER JOIN forum_comment 
    ON (forum_post.post_id = forum_comment.post_id) 
    GROUP BY post_id 
) posts 
ORDER BY effective_date DESC; 

請注意,我用一個稍微不同的表安裝在我的答案,因爲原來的表定義是不可用,但它也可以與任何其他表格設置一起使用。下面是我的例子表:

CREATE TABLE `forum_post` (
    `post_id` int(11) NOT NULL AUTO_INCREMENT, 
    `date` datetime DEFAULT NULL, 
    PRIMARY KEY (`post_id`) 
); 
CREATE TABLE `forum_comment` (
    `comment_id` int(11) NOT NULL AUTO_INCREMENT, 
    `post_id` int(11) DEFAULT NULL, 
    `date` datetime DEFAULT NULL, 
    PRIMARY KEY (`comment_id`) 
); 

我用下面的示例數據來進行測試:

forum_post

+---------+---------------------+ 
| post_id | date    | 
+---------+---------------------+ 
|  1 | 2014-12-01 00:00:00 | 
|  2 | 2014-12-02 00:00:00 | 
|  3 | 2014-12-02 00:00:00 | 
|  4 | 2014-12-03 00:00:00 | 
|  5 | 2014-12-03 00:00:00 | 
|  6 | 2014-12-04 00:00:00 | 
|  7 | 2014-12-06 00:00:00 | 
|  8 | 2014-12-09 00:00:00 | 
+---------+---------------------+ 

forum_comment

+------------+---------+---------------------+ 
| comment_id | post_id | date    | 
+------------+---------+---------------------+ 
|   1 |  1 | 2014-12-01 00:00:00 | 
|   2 |  1 | 2014-12-02 00:00:00 | 
|   3 |  1 | 2014-12-03 00:00:00 | 
|   4 |  2 | 2014-12-23 00:00:00 | 
|   5 |  3 | 2014-12-09 00:00:00 | 
|   6 |  3 | 2014-12-15 00:00:00 | 
|   7 |  5 | 2014-12-15 00:00:00 | 
|   8 |  7 | 2014-12-09 00:00:00 | 
|   9 |  7 | 2014-12-11 00:00:00 | 
+------------+---------+---------------------+ 

有了這些數據,該查詢返回以下結果:

+---------+---------------------+---------------------+---------------------+ 
| post_id | own_date   | last_post_date  | effective_date  | 
+---------+---------------------+---------------------+---------------------+ 
|  2 | 2014-12-02 00:00:00 | 2014-12-23 00:00:00 | 2014-12-23 00:00:00 | 
|  3 | 2014-12-02 00:00:00 | 2014-12-15 00:00:00 | 2014-12-15 00:00:00 | 
|  5 | 2014-12-03 00:00:00 | 2014-12-15 00:00:00 | 2014-12-15 00:00:00 | 
|  7 | 2014-12-06 00:00:00 | 2014-12-11 00:00:00 | 2014-12-11 00:00:00 | 
|  8 | 2014-12-09 00:00:00 | NULL    | 2014-12-09 00:00:00 | 
|  6 | 2014-12-04 00:00:00 | NULL    | 2014-12-04 00:00:00 | 
|  4 | 2014-12-03 00:00:00 | NULL    | 2014-12-03 00:00:00 | 
|  1 | 2014-12-01 00:00:00 | 2014-12-03 00:00:00 | 2014-12-03 00:00:00 | 
+---------+---------------------+---------------------+---------------------+ 
相關問題