Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: order by na podstawie dwóch pól z dwóch różnych tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
darko
Witam!

Chciałbym wyciągnąć 10 idków produktów (top 10), sortując wyniki jednocześnie według ilości zamówionych (sprzedanych) produktów oraz nazwy produktu, poniższe zapytanie wyciąga idki, ale nie działa sortowanie:

Wykonuję następujące zapytanie SQL

  1. SELECT DISTINCT orderdetails.id_cms_prod
  2.  
  3. FROM
  4.  
  5. cms_prod_order_info orderdetails,
  6. cms_prod_order orders,
  7. cms_prod_lang prodlang
  8.  
  9. WHERE
  10.  
  11. prodlang.id_cms_prod=orderdetails.id_cms_prod AND
  12. orderdetails.id_cms_prod_order_info NOT LIKE 1 AND
  13. orders.cms_prod_order_status NOT LIKE 0
  14. ORDER BY orderdetails.cms_prod_order_info_amount DESC, prodlang.cms_prod_lang_name ASC LIMIT 10


W jaki sposób połączyć ze sobą warunki:

- order by ilosc_zamowionych_produktow
- order by nazwa produktu


Struktura tabel:

cms_prod_order_info

  1. CREATE TABLE `xyz`.`cms_prod_order_info` (
  2. `id_cms_prod_order_info` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `id_cms_prod_order` int(10) UNSIGNED NOT NULL,
  4. `id_cms_customer` int(10) UNSIGNED NOT NULL,
  5. `id_cms_manufacturer` int(10) UNSIGNED NOT NULL,
  6. `id_cms_prod` int(10) UNSIGNED NOT NULL,
  7. `id_cms_size` int(10) NOT NULL,
  8. `cms_prod_order_info_size_status` tinyint(1) NOT NULL COMMENT 'status rozmiarow',
  9. `cms_prod_order_info_amount` int(10) UNSIGNED NOT NULL COMMENT 'ilosc zamawianych produktow',
  10. `cms_prod_order_info_price_brutto` float NOT NULL COMMENT 'cena brutto',
  11. `cms_prod_order_info_vat` float NOT NULL COMMENT 'stawka podatku VAT',
  12. `cms_prod_order_info_promo_status` tinyint(1) NOT NULL COMMENT 'status promocji produktu',
  13. `cms_prod_order_info_status` tinyint(1) NOT NULL,
  14. `cms_prod_order_info_desc` text COMMENT 'opcjonalne uwagi do zamowienia',
  15. `cms_prod_order_info_add_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  16. `cms_prod_order_info_add_login` varchar(55) NOT NULL,
  17. `cms_prod_order_info_mod_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  18. `cms_prod_order_info_mod_login` varchar(55) DEFAULT NULL,
  19. PRIMARY KEY (`id_cms_prod_order_info`),
  20. KEY `FK_cms_prod_order_info_1` (`id_cms_prod_order`),
  21. KEY `FK_cms_prod_order_info_2` (`id_cms_customer`),
  22. KEY `FK_cms_prod_order_info_3` (`id_cms_manufacturer`),
  23. KEY `FK_cms_prod_order_info_4` (`id_cms_prod`),
  24. CONSTRAINT `FK_cms_prod_order_info_1` FOREIGN KEY (`id_cms_prod_order`) REFERENCES `cms_prod_order` (`id_cms_prod_order`) ON DELETE CASCADE ON UPDATE CASCADE,
  25. CONSTRAINT `FK_cms_prod_order_info_2` FOREIGN KEY (`id_cms_customer`) REFERENCES `cms_customer` (`id_cms_customer`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  26. CONSTRAINT `FK_cms_prod_order_info_3` FOREIGN KEY (`id_cms_manufacturer`) REFERENCES `cms_manufacturer` (`id_cms_manufacturer`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  27. CONSTRAINT `FK_cms_prod_order_info_4` FOREIGN KEY (`id_cms_prod`) REFERENCES `cms_prod` (`id_cms_prod`) ON DELETE NO ACTION ON UPDATE NO ACTION
  28. ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='Zamowienia - szczegoly'


cms_prod_order

  1. CREATE TABLE `xyz`.`cms_prod_order` (
  2. `id_cms_prod_order` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `id_cms_customer` int(10) UNSIGNED NOT NULL,
  4. `id_cms_courier` int(10) UNSIGNED NOT NULL,
  5. `id_cms_courier_provider` int(10) NOT NULL,
  6. `cms_prod_order_number` varchar(145) NOT NULL COMMENT 'numer zamowienia',
  7. `cms_prod_order_status` int(10) UNSIGNED NOT NULL DEFAULT '1' COMMENT '0 - anulowane, 1 - nowe, 2 - uregulowane, 3 - wyslane',
  8. `cms_prod_order_desc` varchar(255) DEFAULT NULL COMMENT 'uwagi do zamowienia lub powod anulowania',
  9. `cms_prod_order_add_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  10. `cms_prod_order_add_login` varchar(55) NOT NULL,
  11. `cms_prod_order_mod_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  12. `cms_prod_order_mod_login` varchar(55) DEFAULT NULL,
  13. PRIMARY KEY (`id_cms_prod_order`),
  14. KEY `FK_cms_prod_order_1` (`id_cms_customer`),
  15. KEY `FK_cms_prod_order_2` (`id_cms_courier`),
  16. CONSTRAINT `FK_cms_prod_order_1` FOREIGN KEY (`id_cms_customer`) REFERENCES `cms_customer` (`id_cms_customer`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  17. CONSTRAINT `FK_cms_prod_order_2` FOREIGN KEY (`id_cms_courier`) REFERENCES `cms_courier` (`id_cms_courier`) ON DELETE NO ACTION ON UPDATE NO ACTION
  18. ) ENGINE=InnoDB AUTO_INCREMENT=78 DEFAULT CHARSET=utf8 COMMENT='Zamowienia - tabela glowna'


tabela cms_prod_lang (to tabela słownikowa produktu)

  1. CREATE TABLE `xyz`.`cms_prod_lang` (
  2. `id_cms_prod_lang` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `id_cms_lang` int(10) UNSIGNED NOT NULL,
  4. `id_cms_prod` int(10) UNSIGNED NOT NULL,
  5. `id_cms_dept` int(10) UNSIGNED NOT NULL,
  6. `id_cms_art` int(10) UNSIGNED NOT NULL,
  7. `id_cms_serie` int(10) UNSIGNED NOT NULL,
  8. `id_cms_manufacturer` int(10) UNSIGNED NOT NULL,
  9. `cms_prod_lang_name` varchar(145) NOT NULL COMMENT 'nazwa produktu',
  10. `cms_prod_lang_1_desc` text COMMENT 'opis',
  11. `cms_prod_lang_2_desc` text COMMENT 'dodatkowy (opcjonalny) opis',
  12. `cms_prod_lang_status` tinyint(1) NOT NULL,
  13. `cms_prod_lang_add_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  14. `cms_prod_lang_add_login` varchar(55) NOT NULL,
  15. `cms_prod_lang_mod_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  16. `cms_prod_lang_mod_login` varchar(55) DEFAULT NULL,
  17. PRIMARY KEY (`id_cms_prod_lang`),
  18. KEY `FK_cms_prod_lang_1` (`id_cms_lang`),
  19. KEY `FK_cms_prod_lang_2` (`id_cms_prod`),
  20. KEY `FK_cms_prod_lang_3` (`id_cms_dept`),
  21. KEY `FK_cms_prod_lang_4` (`id_cms_art`),
  22. KEY `FK_cms_prod_lang_5` (`id_cms_serie`),
  23. KEY `FK_cms_prod_lang_6` (`id_cms_manufacturer`),
  24. CONSTRAINT `FK_cms_prod_lang_1` FOREIGN KEY (`id_cms_lang`) REFERENCES `cms_lang` (`id_cms_lang`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  25. CONSTRAINT `FK_cms_prod_lang_2` FOREIGN KEY (`id_cms_prod`) REFERENCES `cms_prod` (`id_cms_prod`) ON DELETE CASCADE ON UPDATE CASCADE,
  26. CONSTRAINT `FK_cms_prod_lang_3` FOREIGN KEY (`id_cms_dept`) REFERENCES `cms_dept` (`id_cms_dept`) ON DELETE CASCADE ON UPDATE NO ACTION,
  27. CONSTRAINT `FK_cms_prod_lang_4` FOREIGN KEY (`id_cms_art`) REFERENCES `cms_art` (`id_cms_art`) ON DELETE CASCADE ON UPDATE CASCADE,
  28. CONSTRAINT `FK_cms_prod_lang_5` FOREIGN KEY (`id_cms_serie`) REFERENCES `cms_serie` (`id_cms_serie`) ON DELETE CASCADE ON UPDATE CASCADE,
  29. CONSTRAINT `FK_cms_prod_lang_6` FOREIGN KEY (`id_cms_manufacturer`) REFERENCES `cms_manufacturer` (`id_cms_manufacturer`) ON DELETE NO ACTION ON UPDATE NO ACTION
  30. ) ENGINE=InnoDB AUTO_INCREMENT=7494 DEFAULT CHARSET=utf8 COMMENT='Dane slownikowe produktow'
mooschka
Przerzuć warunek złączenia do
  1. JOIN cms_prod_lang ON prodlang.id_cms_prod=orderdetails.id_cms_prod

Poza tym po co stosujesz warunek LIKE do pól typu INT? I czy masz aż tak duże ilości danych, że stosujesz INT jako PRIMARY_KEY?
Jeśli chodzi o sortowanie to spróbuj tak:
  1. SELECT pole1, pole2 ... FROM (SELECT pole1, pole2 ... FROM tabela1 JOIN tabela2 ON warunek_złączenia JOIN ... WHERE warunki) AS T
  2. ORDER BY pole1 ASC, pole2 ASC
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.