2015-05-09 58 views
-2

我需要在視圖中顯示類別明智的一個圖像,但下面的查詢集中收集所有類別圖像並將每個類別項目顯示爲洞。按類別順序顯示圖像的Mysql查詢

SELECT * 
         FROM (
          (SELECT *, 
           IF(@prev <> category_id, 
            @rownum := 1, 
            @rownum := @rownum+1 
           ) AS rank, 
           @prev := category_id, 
           @rownum 
          FROM (
          SELECT * FROM products 
          ORDER BY category_id, rand() 
         ) random_prodcts) 
         ) products_ranked 
         WHERE rank <= 20000 AND parent_category_id = 3; 

我想這個查詢修改,並顯示每一類項目作爲一個直到所有的項目都在循環逐一顯示。

這是表結構。

Id Parent_category_id Category_id Product_position 
1   3     77 00 
2   3     77 00 
3   3     78 00 
4   3     78 00 
5   3     89 00 
6   3     89 00 
+0

我很難理解規範。 (什麼是「項目」?「每個類別項目」和「一個循環中的一個」是什麼意思?)預期結果集合的一個*示例*將有助於解釋這個需求。 (顯示的查詢是否返回了你需要的行,但是你需要它們的順序是不同的?(查詢看起來比它需要的更復雜,我們在這裏看不到任何初始化'@ prev'和'@ ) – spencer7593

回答

0

如果您需要在行特定的順序返回,然後在外層查詢添加ORDER BY

例如,如果要與1的rank返回所有行,然後再是這樣的:

SELECT r.* 
    FROM ( 
      SELECT @rownum := IF(@prev = r.category_id, @rownum+1, 1) AS rank 
       , p.id 
       , p.parent_category_id 
       , @prev := p.category_id AS category_id 
       , p.product_position 
      FROM products p 
      CROSS 
      JOIN (SELECT @prev := NULL, @rownum := 0) i 
      ORDER 
       BY p.category_id 
       , RAND() 
     ) r 
WHERE r.parent_category_id = 3 
    AND r.rank <= 20000 
    ORDER 
    BY r.rank 
     , r.category_id 

我不理解爲什麼在parent_category_id列平等謂詞在外部查詢,而不是在內部查看查詢。如果parent_category_id依賴於category_id(示例數據未顯示與多個parent_category_id關聯的category_id值的示例),那麼我認爲沒有任何理由無法重新定位,以獲得更好的性能,通過減少需要物化到內聯視圖中的數量或行數,並減少對函數的調用次數,並減少需要排序的集合的大小。

+0

我需要顯示類別明智的項目,所以我給parent_category _id範圍從1 - 7和category_id從1到85,事情是,如果它返回與parent_category_id = 3那麼它有幾個像元素5一樣的項目會多次到達,它會單獨按升序顯示5個類別元素,但是我需要像(3,5)(3,6)(3,7)一樣循環檢索記錄,然後再次像(3,5),(3,6)(3,7)...等等。 –