nemakuphp Posted December 11, 2011 Report Share Posted December 11, 2011 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 More sharing options...
draugz Posted December 12, 2011 Report Share Posted December 12, 2011 Ī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 More sharing options...
nemakuphp Posted December 12, 2011 Author Report Share Posted December 12, 2011 (edited) Š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 December 12, 2011 by nemakuphp Link to comment Share on other sites More sharing options...
daGrevis Posted December 12, 2011 Report Share Posted December 12, 2011 > Kurš no šiem variantiem būs ātrāks? Notestē! :] Minēt nekad nav bijusi liela jēga... Link to comment Share on other sites More sharing options...
draugz Posted December 12, 2011 Report Share Posted December 12, 2011 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 More sharing options...
nemakuphp Posted December 12, 2011 Author Report Share Posted December 12, 2011 #1 - http://awesomescreenshot.com/069q06ace #2 - http://awesomescreenshot.com/03dq063ef Link to comment Share on other sites More sharing options...
draugz Posted December 12, 2011 Report Share Posted December 12, 2011 Rekā, izrādās, tavā gadījumā labākais risinājums ir pirmais! 1) Indeksi izmantojas efektīvāk 2) Nav temporary table 3) Nav filesort Link to comment Share on other sites More sharing options...
nemakuphp Posted December 12, 2011 Author Report Share Posted December 12, 2011 Ok, liels paldies. Link to comment Share on other sites More sharing options...
Recommended Posts