• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Złożone zapytanie SQL

Object Storage Arubacloud
0 głosów
459 wizyt
pytanie zadane 24 grudnia 2019 w SQL, bazy danych przez chmieluziomal Początkujący (450 p.)

Witam wszystkich,

muszę wybrać po jednej nazwie grupy atrybutów i ich ID, które są przypisane w rekordach tabeli sub_category_attributes, a w tym rekordzie kolumna sub_category ma mieć 38.

Schemat relacji między tabelami: https://imgur.com/AiCHbKb

Rekordy tabeli attribute_groupshttps://imgur.com/gY7T3HL

Rekordy tabeli attributeshttps://imgur.com/egKyDpo

Rekordy tabeli sub_category_attributeshttps://imgur.com/hm8rg4T

Moje zapytanie SQL:

SELECT attribute_groups.attribute_group_id, attribute_groups.attribute_group_name FROM sub_category_attributes, attributes, attribute_groups WHERE attributes.attribute_group_id = attribute_groups.attribute_group_id AND sub_category_attributes.attribute_id = attributes.attribute_id AND sub_category_attributes.sub_category_id = 38

Rezultat zapytania: https://imgur.com/hse7eya

Problem w tym, że nazwy grup powtarzają się ze względu na ich relacje z tabelą attributes i nie wiem jak sformułować zapytanie tak, aby uzyskać tylko po jednej nazwie grupy.

komentarz 24 grudnia 2019 przez Aisekai Nałogowiec (42,190 p.)
Select distinct.

1 odpowiedź

+1 głos
odpowiedź 24 grudnia 2019 przez Chess Szeryf (76,710 p.)
wybrane 24 grudnia 2019 przez chmieluziomal
 
Najlepsza

Tabela sub_category_attributes jest chyba niepotrzebna, więc wyrzuć ją.

Jeśli chcesz pogrupować rekordy według danego kryterium, by nie były np. dublowane w ten sposób, to napisz zapytanie na końcu z tym GROUP BY. I tak jak wspomniał ktoś w komentarzu mozesz połączyć GROUP BY z DISTINCT.

-- ...
GROUP BY `attribute_groups.attribute_group_id`;
komentarz 24 grudnia 2019 przez chmieluziomal Początkujący (450 p.)

Tabela sub_category_attributes trzyma atrybuty dla danej podkategorii, tak aby nie powtarzać ich w specyfikacji produktów, więc jest niezbędna. W całym schemacie bazy danych to widać, ale nie chciałem go niepotrzebnie wrzucać. W każdym bądź razie dzięki wielkie za pomoc wink

komentarz 24 grudnia 2019 przez Chess Szeryf (76,710 p.)

A nie lepiej byłoby utworzyć tabelę z rekordami, które byłyby "granicami" - "od", "do"?

SHOW CREATE TABLE `name_tbl`\G - pokazuje jak została utworzona tabela.

Tabela "sub_category_attributes"

id from1 to1 value1
1 2 10 38
2 26 44 45
CREATE TABLE `sub_category_attributes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `from1` int(11) DEFAULT NULL,
  `to1` int(11) DEFAULT NULL,
  `value1` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

Tabela "attributes"

+--------------+----------------------------+--------------------+
| attribute_id | attribute_name             | attribute_group_id |
+--------------+----------------------------+--------------------+
|            1 | Producent                  |                  1 |
|            2 | Kod producenta             |                  1 |
|            3 | EAN                        |                  1 |
|            4 | Kolor                      |                  2 |
|            5 | Wodoodporny                |                  2 |
|            6 | System operacyjny          |                  4 |
|            7 | Procesor                   |                  4 |
|            8 | Taktowanie procesora [Ghz] |                  4 |
|            9 | Pamiec RAM                 |                  4 |
|           10 | Pamiec wbudowana           |                  4 |
|           11 | USB                        |                  5 |
|           12 | Zlacza audio               |                  5 |
|           13 | Lacznosc bezprzewodowa     |                  5 |
|           14 | Rodzaj wyswietlacza        |                  6 |
|           15 | Przekatna ekranu ['']      |                  6 |
|           16 | Rozdzielczosc              |                  6 |
|           17 | Aparat glowny [MPix]       |                  7 |
|           18 | Aparat przedni [MPix]      |                  7 |
|           19 | Pojemnosc                  |                  8 |
|           20 | Wysokosc [cm]              |                  9 |
|           21 | Szerokosc [cm]             |                  9 |
|           22 | Glebokosc [cm]             |                  9 |
|           23 | Waga [cm]                  |                  9 |
|           24 | Obsluga kart pamieci       |                  4 |
|           25 | Maksymalna pojemnosc karty |                  4 |
+--------------+----------------------------+--------------------+
CREATE TABLE `attributes` (
  `attribute_id` int(11) NOT NULL AUTO_INCREMENT,
  `attribute_name` varchar(40) DEFAULT NULL,
  `attribute_group_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`attribute_id`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

Tabela "attribute_groups"

+--------------------+-----------------------+
| attribute_group_id | attribute_group_name  |
+--------------------+-----------------------+
|                  1 | Produkt               |
|                  2 | Informacje podstawowe |
|                  3 | Techniczne            |
|                  4 | Zlacza                |
|                  5 | Wyswietlacz           |
|                  6 | Aparat                |
|                  7 | Bateria               |
|                  8 | Fizyczne              |
+--------------------+-----------------------+
CREATE TABLE `attribute_groups` (
  `attribute_group_id` int(11) NOT NULL AUTO_INCREMENT,
  `attribute_group_name` varchar(40) DEFAULT NULL,
  PRIMARY KEY (`attribute_group_id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

Tabela, która jest pokazana po zapytaniu.

+--------------------+-----------------------+
| attribute_group_id | attribute_group_name  |
+--------------------+-----------------------+
|                  1 | Produkt               |
|                  2 | Informacje podstawowe |
|                  4 | Zlacza                |
+--------------------+-----------------------+
SELECT attribute_groups.attribute_group_id, attribute_groups.attribute_group_name FROM attributes, attribute_groups, sub_category_attributes WHERE attributes.attribute_group_id = attribute_groups.attribute_group_id AND attributes.attribute_id >= sub_category_attributes.from1 and attributes.attribute_id <= sub_category_attributes.to1 group by attribute_groups.attribute_group_id;
komentarz 25 grudnia 2019 przez chmieluziomal Początkujący (450 p.)
Nie jest to dobry pomysł z jednego powodu. Dla danej podkategorii atrybuty specyfikacji mogą być rozstrzelone po całej tabeli ze względu na to, że może je dowolnie dodawać i usuwać klient.

Podobne pytania

+2 głosów
2 odpowiedzi 236 wizyt
pytanie zadane 9 marca 2022 w SQL, bazy danych przez Czang Kai Shrek Obywatel (1,990 p.)
0 głosów
1 odpowiedź 139 wizyt
pytanie zadane 5 grudnia 2020 w SQL, bazy danych przez lumix97 Nowicjusz (120 p.)
+1 głos
3 odpowiedzi 633 wizyt

92,615 zapytań

141,465 odpowiedzi

319,779 komentarzy

61,997 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...