Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL]Grupowanie wg. masek z innej tabeli
timon27
post
Post #1





Grupa: Zarejestrowani
Postów: 578
Pomógł: 69
Dołączył: 15.04.2007
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Posiadam dwie tabele w mysql.
Tabela towarów:
  1. NAZWA CENA
  2. krem jkiśtam 2,4
  3. krem cośtam 1,5
  4. szampon cośtam 3,4
  5. szampon cośtam2 3,5

oraz początków nazw - identyfikująca rodzaj produktu:
  1. MASKA
  2. krem
  3. szampon

Chciałbym pogrupować pierszą tabelę wg początków nazw z drugiej.
(kolumna 'cena' jest tylko po to aby pokazać że grupowanie nie jest bezsensowne).
Jakieś pomysły?
Pierwszej tabeli nie mogę edytować.

Żeby nie było: mysql znam, nie radzę sobie tylko ze zmienną długością masek.
Gdyby wszystkie maski miały tą samą długość nie miałbym problemu:
  1. SELECT * FROM
  2. (SELECT *,SUBSTR(nazwa,1,5) AS maska FROM towary) AS first
  3. JOIN maski
  4. ON maski.maska=first.maska
  5. GROUP BY maski.maska


Ten post edytował timon27 7.05.2013, 09:20:58
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mortus
post
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


Najgorszym z możliwych rozwiązań jest takie złączenie:
  1. SELECT `m`.`maska`, SUM(`t`.`cena`) FROM `towary` `t`, `maski` `m`
  2. WHERE LOCATE(`m`.`maska`, `t`.`nazwa`) = 1
  3. GROUP BY `m`.`maska`


Najbardziej optymalnym i w dodatku bezinwazyjnym (nie trzeba modyfikować czyjejś aplikacji) rozwiązaniem wydaje się być utworzenie trzeciej tabeli maski_towarow zawierającej jedynie dwie kolumny id_maski i id_towaru, obie będące kluczem głównym. Później jednorazowym zapytaniem
  1. INSERT INTO `maski_towarow` SELECT `m`.`id`, `t`.`id` FROM `maski` `m`, `towary` `t` WHERE LOCATE(`m`.`maska`, `t`.`nazwa`) = 1

uzupełniamy tabelę maski_towarow i w naszej "części" aplikacji korzystamy właśnie z niej:
  1. SELECT `m`.`maska`, SUM(`t`.`cena`) FROM `maski` `m`
  2. LEFT JOIN `maski_towarow` `mt` ON `m`.`id` = `mt`.`id_maski`
  3. LEFT JOIN `towary` `t` ON `mt`.`id_towaru` = `t`.`id`
  4. GROUP BY `m`.`id`
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 11.10.2025 - 03:50