2012-02-17 26 views
0

我需要一些幫助搞清楚查詢MySQL的先進集體查詢

我有3個表

sources 
id, name, rank 

origin 
id, source_id (FK to sources id), name 

One source can have many origins 

product 
id, origin_id (FK to origin id), name, time_added 

One origin can have many products 

現在,我要的是可以選擇每個源的最新產品,按等級下降

有序

有什麼建議嗎?

+0

你可以給一些輸出的記錄? – Vikram 2012-02-17 10:50:42

+0

嗨。不幸的是,以上描述僅僅是真實表格和數據的簡化版本。對不起 – Thomas 2012-02-17 12:19:42

回答

1

這應該做你要求,但沒有樣品輸出很難100%肯定。內部查詢選擇鏈接到按照從最新到最舊添加的日期排序的源ID的產品,然後將其加入源和分組。

SELECT 
    * 
FROM sources AS s 
INNER JOIN (
    SELECT 
     origins.source_id, 
     product.* 
    FROM origin 
    INNER JOIN product 
    ON product.origin_id = origin.origin_id 
    ORDER BY time_added DESC 
) AS productsOrdered 
ON productsOrdered.source_id = sources.source_id 

ORDER BY s.rank DESC, productsOrdered.time_added DESC 

這樣就不必做潛在的昂貴opreations作爲內部的選擇應該是相當快,可以根據需要

+0

太棒了。唯一缺少的是在訂單 – Thomas 2012-02-17 12:51:16

+0

A之前的GROUP BY s.id跟在上面的答案。我曾嘗試將第二列添加到order by,即ORDER BY sources.rank DESC,time_added DESC,但它不起作用。子查詢是否對ORDER BY子句構成限制? – Thomas 2012-02-20 13:49:11

+0

ORDER BY s.rank,productsOrdered.time_added會正常工作。出於外部查詢的目的,子查詢實際上是一個名爲productsOrdered的表。 – 2012-02-20 13:51:40

0

這樣做的一個典型方式是

  • 找到MAX(time_added)各起點
  • 獲取該產品的id對這些來歷
  • 加入與sourcesorigin表檢索所有列

請注意,此失敗如果有多個記錄的來源與time_added完全相同。

SQL語句

SELECT * 
FROM sources s 
     INNER JOIN origin o ON o.source_id = s.id 
     INNER JOIN product p ON p.origin_id = o.id 
     INNER JOIN (
      SELECT id 
      FROM product p 
        INNER JOIN (
        SELECT origin_id 
          , MAX(time_added) AS time_addded 
        FROM product p 
        GROUP BY 
          origin_id 
       ) pmax ON pmax.origin_id = p.origin_id 
          AND pmax.time_added = p.time_added        
     ) pmax ON pmax.id = p.id     
0
SELECT o.id,count(o.id) as numOfProdFromOrig p.id, p.name, p.time_added, s.rank 
FROM product as p NATURAL JOIN sources as s NATURAL JOIN origin as o 
GROUP BY (numOfProdFromOrig) 
ORDER BY s.rank DESC 
0
select b.id,(select p.name from origin o inner join product p 
on p.origin_id = o.id where o.source_id = b.id order by time_added desc limit 1)a as product_name 
from source b ; 

試試這個限制: