2014-10-28 69 views
0

最初我需要建立一個查詢獲取sites從最新articlearticles放置在單獨的表中)的日期排序的一個表中。INNER JOIN請求中`GROUP BY`之前的`ORDER BY`?

我建立以下查詢:

SELECT * 
FROM `sites` 
INNER JOIN `articles` ON `articles`.`site_id` = `sites`.`id` 
ORDER BY `articles`.`date` DESC 
GROUP BY `sites`.`id` 

我假設SELECTINNER JOIN將獲取所有帖子網站每一個通過的後下降相關聯,比ORDER BY訂貨會結果日期比GROUP BY將採取每個網站第一個職位,我會得到所需的結果。

但是我收到的MySQL錯誤#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY網站. ID LIMIT 0, 30' at line 7

如果我把GROUP BY以前ORDER BY語句中的查詢工作,但它不會給我最新後爲每個站點。相反,結果將被排序組合這不是我需要的事情(實際上,我可能更喜歡以另一種方式分組後)。

我讀了幾個非常相似的問題,但它們都與存儲在單個表中的數據相關,因此可以使用MAXMIN函數。

我該怎麼做才能實現我所需要的?

回答

0

最後我提出瞭解決方案。

首先,我將主查詢從sites表中的查詢改爲從articles查詢。接下來,我將MAX(date)列添加到結果中。

所以我實現需要的東西結果查詢如下:

SELECT `sites`.`url`,MAX(`articles`.`date`) AS `last_article_date` 
    FROM `articles` 
    INNER JOIN `sites` ON `sites`.`id` = `article`.`site_id` 
    GROUP BY `site_id` 
    ORDER BY `last_article_date` ASC 

感謝大家給我的提示和正確的搜索方向!

0

的SQL重寫以下語法 -

SELECT `articles`.`article_name`,'sites'.'id','articles'.'site_id' 
 
FROM `sites`,'articles' 
 
WHERE `articles`.`site_id` = `sites`.`id` 
 
ORDER BY 'sites'.'id', `articles`.`date` DESC;

做這樣的事情在SELECT語句。按功能分組要求將所有字段分組。因此*的使用是不可能的。

+2

您正在從'sites'中選擇行並通過'articles'過濾結果。是不是缺少的東西? – 2014-10-28 17:07:09

+0

**#1054 - 'where子句**'中未知的列'articles.site_id',這是相當期待的,因爲MySQL不應該知道'articles'表是什麼。 – 2014-10-28 17:08:38

+0

請從兩個表中選擇必填字段,而不是給*。然後通過操作將所有這些字段從sites.id開始。試試吧。我目前沒有在這裏的MySQL,所以不能在這裏嘗試。 – 2014-10-28 17:16:29

1

您可以使用子查詢/派生表/直列視圖或自我排斥加盟,如:

SELECT s.*, a1.* 
FROM `sites` s 
    INNER JOIN `articles` a1 ON a1.`site_id` = s.`id` 
    LEFT OUTER JOIN `articles` a2 ON a2.`site_id` = a1.`site_id` 
     AND a2.`date` > a1.`date` 
WHERE 
    a2.`site_id` IS NULL 
ORDER BY 
    a1.`date` DESC 

的原則是,你選擇其中有沒有文章日期越大網站比任何其他文章的日期。

0
SELECT * FROM ( SELECT `S.<col1>`, `S.<col2>`, `A.<col1>`,`A.<col2>`, 
          ROW_NUMBER() 
          OVER (PARTITION BY `SITES`.`ID` 
           ORDER BY `SITES`.`ID` DESC) 
           RID 
         FROM `SITES` `S`,`ARTICLES` `A` 
         WHERE `ARTICLES`.`SITE_ID` = `SITES`.`ID` 
       ) 
      WHERE RID = 1; 

你能試試嗎?

+0

對不起,但這個查詢看起來太複雜了**我** :(我最好使用我能理解的查詢。 – 2014-10-28 17:41:49