Jump to content
php.lv forumi

Datu izvilkšana


nemakuphp

Recommended Posts

Ir datubāze ar 3 tabulām - items(item_id, item_name), categories(cat_id, cat_name), items_categories(item_id, cat_id)

 

Vienam itemam var būt vairākas kategorijas.

 

Lai izvilktu itemus un to kategorijas, pagaidām ir šāds SQL kverijs, nezinu, gan cik tas ir labs.

 

SELECT i.*, GROUP_CONCAT(CAST(ic.cat_id AS CHAR)) AS cat_ids, GROUP_CONCAT(c.cat_name) AS cat_names FROM items i LEFT JOIN items_categories ic ON i.item_id = ic.item_id LEFT JOIN categories c ON ic.cat_id = c.cat_id GROUP BY ic.item_id

 

Mans jautājums būtu, kā izveidot SQL vaicājumu, lai varētu paņemt itemus, kas ir noteiktā kategorijā, jo pieliekot pie kverija

WHERE c.id = 1

lauki cat_ids un cat_names satur tikai šīs kategorijas ar ID 1 datus. Nepieciešami arī pārējo kategoriju, kurām ir piesaistīts šis items, dati.

 

Varbūt ir kāds labāks risinājums, kā šo realizēt?

Link to comment
Share on other sites

Īsti līdz galam neizpratu problēmu, bet varbūt var kaut kā šādi:

SELECT i.*, GROUP_CONCAT(CAST(ic2.cat_id as CHAR)) as cat_ids, GROUP_CONCAT(c.cat_name) as cat_names
FROM items_categories ic
INNER JOIN items_categories ic2 on ic.item_id = ic2.item_id
INNER JOIN items i on i.item_id = ic2.item_id
INNER JOIN categories c on ic2.cat_id = c.cat_id
WHERE c.id = 1
GROUP by ic.item_id

Ideja, tāda, ka sākumā atlasi itemus no vajadzīgās kategorijas, pēc tam atbilstoši šiem itemiem atrodi citas kategorijas un pievelc klāt papildus datus.

Pieļauju, ka categories ir PK index uz cat_id, tāpēc varbūt labāk šo pierakstīt pat šādi:

 

SELECT i.*, GROUP_CONCAT(CAST(ic2.cat_id as CHAR)) as cat_ids, GROUP_CONCAT(c.cat_name) as cat_names
FROM categories c2
INNER JOIN items_categories ic2 on c2.cat_id = ic2.cat_id
INNER JOIN items i on i.item_id = ic2.item_id
INNER JOIN categories c on ic2.cat_id = c.cat_id
WHERE c2.id = 1
GROUP by ic.item_id

Link to comment
Share on other sites

Šie jau bija tuvāk, otrais gan nestrādā, kā vajag, bet pirmajam bija jānomaina

WHERE c.id = 1

uz

WHERE ic.cat_id = 1

Otrais sanāca kaut kā šādi

SELECT i.*, GROUP_CONCAT(CAST(ic2.cat_id as CHAR)) as cat_ids, GROUP_CONCAT(c2.cat_name) as cat_names
FROM categories c2
INNER JOIN item_categories ic2 on c2.cat_id = ic2.cat_id
INNER JOIN items i on i.item_id = ic2.item_id
INNER JOIN items_categories ic on ic.item_id = ic2.item_id
INNER JOIN categories c on ic2.cat_id = c.cat_id
WHERE c.id = 6
GROUP by ic.item_id

 

Kurš no šiem variantiem būs ātrāks? Ir PK index uz categories cat_id un items item_id, uz items_categories item_id un cat_id parasts index

Edited by nemakuphp
Link to comment
Share on other sites

Lai varētu tev iedot precīzu risinājumu bišku pa maz info pašā sākumā bija, vismaz priekš manis :)

Bet nu man liekas ka otrais variants ir ātrāks, PK jebkurā gadījumā ir ātrāks par parasto indexu, bet nu šo to tev noteikti pastāstīs

explain :)

EXPLAIN SELECT i.*, GROUP_CONCAT(CAST(ic2.cat_id as CHAR)) as cat_ids, GROUP_CONCAT(c2.cat_name) as cat_names
FROM categories c2
INNER JOIN item_categories ic2 on c2.cat_id = ic2.cat_id
INNER JOIN items i on i.item_id = ic2.item_id
INNER JOIN items_categories ic on ic.item_id = ic2.item_id
INNER JOIN categories c on ic2.cat_id = c.cat_id
WHERE c.id = 6
GROUP by ic.item_id

Izdos tev info, kā notiek datu atlase. ja iekopēsi abus rezultātus varbūt kopīgiem spēkiem nonāksim pie pareizā risinājuma :)

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...