2016-03-21 16 views
0

için farklı bir sonuç verir. MySQL 5.6'ya geçiş yaptığımdan beri, birleşik bir çizelgenin sırası ile sorun yaşıyorum. Bu iyi çalıştı MySQL 5.1Farklı MySQL sürümleri LEFT JOIN ve ORDER alt sorgularında

Product_cat_pictures içindeki her kategori için her son tek resmi (en yüksek id) seçmek istiyorum. Aynı sorgunun her uygulamasında, belirli kategoriler için resimlerin sırası farklıdır. repo.filename için rasgele bir değer (ilk erişilebilir değer) dönen, sadece c.id üzerinde

SELECT c.id, repo.filename FROM product_cat_container AS c 
LEFT JOIN (SELECT * FROM product_cat_pictures ORDER BY id DESC) AS p 
    ON c.id = p.cat_id 
LEFT JOIN picture_repository AS repo 
    ON p.picture_id = repo.id 
GROUP BY c.id 
ORDER BY c.order; 

GROUP BY geçerli:

SELECT c.id, repo.filename FROM product_cat_container AS c 
LEFT JOIN (SELECT * FROM product_cat_pictures ORDER BY id DESC) AS p 
    ON c.id = p.cat_id 
LEFT JOIN picture_repository AS repo 
    ON p.picture_id = repo.id 
GROUP BY c.id 
ORDER BY c.order 


product_cat_container 
--------------------- 
id name order 


product_cat_pictures 
--------------------- 
id cat_id picture_id 


picture_repository 
--------------------- 
id filename 
+0

Kontrol [GROUP BY 12.19.3 MySQL Taşıma] (http://dev.mysql.com/doc/refman/5.6/en/group-by -handling.html). – wchiquito

cevap

0

Sen OLMAYAN ANSI SQL kullandı. Bu davranış MySQL sürümüne özgüdür.

SELECT c.id, MIN(repo.filename) AS filename FROM product_cat_container AS c 
LEFT JOIN (SELECT * FROM product_cat_pictures ORDER BY id DESC) AS p 
    ON c.id = p.cat_id 
LEFT JOIN picture_repository AS repo 
    ON p.picture_id = repo.id 
GROUP BY c.id 
ORDER BY c.order; 

İşte MIN işlevi doğru sonucu (minimum değer) dönen ilgilenir:

bir ANSI uyumlu sorgu bu rastgele davranışı yok.

Alternatif:

SELECT c.id, repo.filename FROM product_cat_container AS c 
LEFT JOIN (SELECT * FROM product_cat_pictures ORDER BY id DESC) AS p 
    ON c.id = p.cat_id 
LEFT JOIN picture_repository AS repo 
    ON p.picture_id = repo.id 
GROUP BY c.id,repo.filename 
ORDER BY c.order; 

Buraya GROUP BY id başına daha sonra 1 sonuç sağlamayacağından tüm sütun vardır, ama yine bir ANSI geçerlidir (yani% 100 tanımlanmıştır) olan sonuç.

İstediğiniz sonucu almak için hangi işlevi/stili kullanacağınızı seçmeniz gerekecektir.

0

Tabanda milyonlarca satır varsa, yabancı anahtar ve indeks eklemeyi ve performans sorunlarından kaçınmayı unutmayın.

Dene:

SQL Fiddle demo

mysql> DROP TABLES IF EXISTS `product_cat_container`; 
Query OK, 0 rows affected (0.00 sec) 

mysql> DROP TABLES IF EXISTS `product_cat_pictures`; 
Query OK, 0 rows affected (0.00 sec) 

mysql> DROP TABLES IF EXISTS `picture_repository`; 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE IF NOT EXISTS `product_cat_container` (
    ->  `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    ->  `name` VARCHAR(25), 
    ->  `order` INT UNSIGNED 
    ->); 
Query OK, 0 rows affected (0.01 sec) 

mysql> CREATE TABLE IF NOT EXISTS `product_cat_pictures` (
    ->  `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    ->  `cat_id` INT UNSIGNED, 
    ->  `picture_id` INT UNSIGNED 
    ->); 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE IF NOT EXISTS `picture_repository` (
    ->  `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    ->  `filename` VARCHAR(25) 
    ->); 
Query OK, 0 rows affected (0.00 sec) 

mysql> INSERT INTO `product_cat_container` 
    ->  (`name`, `order`) 
    -> VALUES 
    ->  ('AAA', 1), ('BBB', 2), ('CCC', 3), ('DDD', 4); 
Query OK, 4 rows affected (0.00 sec) 
Records: 4 Duplicates: 0 Warnings: 0 

mysql> INSERT INTO `picture_repository` 
    ->  (`filename`) 
    -> VALUES 
    ->  ('AAA'), ('BBB'), ('CCC'), ('DDD'), ('EEE'); 
Query OK, 5 rows affected (0.00 sec) 
Records: 5 Duplicates: 0 Warnings: 0 

mysql> INSERT INTO `product_cat_pictures` 
    ->  (`cat_id`, `picture_id`) 
    -> VALUES 
    ->  (1, 4), (1, 2), (1, 1), (2, 3), (3, 5), (3, 4); 
Query OK, 5 rows affected (0.00 sec) 
Records: 5 Duplicates: 0 Warnings: 0 

mysql> SELECT 
    -> `c`.`id`, 
    -> `repo`.`filename` 
    -> FROM 
    -> `product_cat_container` `c` 
    ->  LEFT JOIN (
    ->     SELECT 
    ->     `p`.`cat_id`, 
    ->     `p`.`picture_id` 
    ->     FROM 
    ->     `product_cat_pictures` `p` 
    ->      INNER JOIN (
    ->         SELECT 
    ->         MAX(`id`) `id` 
    ->         FROM 
    ->         `product_cat_pictures` 
    ->         GROUP BY 
    ->         `cat_id` 
    ->        ) `d` ON `p`.`id` = `d`.`id` 
    ->    ) `p` ON `c`.`id` = `p`.`cat_id` 
    ->  LEFT JOIN `picture_repository` `repo` ON `p`.`picture_id` = `repo`.`id` 
    -> ORDER BY 
    -> `c`.`order`; 
+----+----------+ 
| id | filename | 
+----+----------+ 
| 1 | AAA  | 
| 2 | CCC  | 
| 3 | DDD  | 
| 4 | NULL  | 
+----+----------+ 
4 rows in set (0.00 sec)