Autor Zpráva
medden
Profil *
Zdravím,
mám nasledujúci (škaredý) select:

SELECT
`configs`.`name` AS `name`,
`configs`.`value` AS `value`,
IF ( `applications`.`type_application`= 'plugin', `plugins`.`name`, `services`.`name` ) AS `application`,
FROM `edenus_configs` AS `configs`
/* získanie aplikácie... */
LEFT JOIN `edenus_applications` AS `applications` ON `configs`.`application_id`= `applications`.`id`
LEFT JOIN `edenus_plugins` AS `plugins` ON `applications`.`type_id`= `plugins`.`id`
LEFT JOIN `edenus_services` AS `services` ON `applications`.`type_id`= `plugins`.`id`
/* toto nás zaujíma */
WHERE
( `services`.`name`= 'blog' OR `services`.`name`= 'system' OR `plugins`.`name` IN ( 'plugin_name', 'plugin_name2' ) )
AND ( `configs`.`user_id`= 1 /* nejake cislo */ OR `configs`.`user_id` IS NULL )
AND ( `configs`.`group_id`= 1 /* nejake cislo */ OR `configs`.`group_id` IS NULL )
/* zoradenie podľa priority */
ORDER BY
`configs`.`group_id` DESC,
`configs`.`user_id` DESC


Čo to zhruba robí: vytiahne z databázy konfiguračné nastavenia (meno, hodnota) a prislúchajúcu aplikáciu.

Jedná sa o to, že nastavenie môže byť: užívateľské, skupinové, globálne (sú zoradené podľa priority: ak užívateľ nemá svoje nastavenie, použije sa skupinové, a ak ani to nie je, tak globálne).
Doteraz som to zvládol, všetko to mám pekne spravené v tom selecte, len to má jednu chybičku:
vracia to všetky nastavenia, nie iba tie, čo potrebujem. Teda, vracia mi to aj globálne, aj skupinové, aj užívateľské nastavenia, nie iba to nastavenie s najvyššou prioritou.

Ono by sa to síce dalo spracovať, ale ide o to, že tých nastavení môže byť riadna kopa (keďže každý užívateľ si môže všetko nastaviť) a bol by to zbytočne veľký prenos dát. Skúšal som to riešiť cez DISTINCT, trik, ale nepodarilo sa...

Ešte štruktúra pre configy (Na ostatných príliš nezáleží, sú len na získanie aplikácie.):
CREATE TABLE `edenus_configs` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(40) collate utf8_slovak_ci NOT NULL default '',
`value` text collate utf8_slovak_ci NOT NULL,
`application_id` int(11) NOT NULL default '0',
`user_id` int(11) default '0',
`group_id` int(11) default '0',
/* ešte nejaké veci, indexy ... */
)
Vopred veľmi ďakujem :-)
Kajman_
Profil *
ORDER BY

ifnull(`configs`.`user_id`, ifnull(`configs`.`group_id`, 'globalni hodnota')) DESC

Teda jestli jsem to zběžným pohledem odhadl, cože vlastně chceš.
medden
Profil *
> Teda jestli jsem to zběžným pohledem odhadl, cože vlastně chceš.
Si zle odhadol :-) Asi som to zle formuloval, pokúsim sa o príklad:
Z databázy mi prídu výsledky (z toho query vyššie):
Riadok | Meno | Hodnota | aplikácia
#1 | var | value1 | plugin
#2 | var | value2 | plugin
#3 | var | value3 | plugin
#4 | xyz | value1 | plugin2
#5 | xyz | value2 | plugin2

Tento výsledok je už zoradený podľa priority: pre var sa použije #1, pre xyz #4. Teda ja potrebujem vyhodiť z výsledku riadky #2 #3 #5 aby sa mi neprenášali zbytočné dáta (tie riadky majú spoločné meno - var, xyz)
Kajman_
Profil *
Tak na to možná stačí group by meno, aplikacia a na hodnotu dát max.
medden
Profil *
> Tak na to možná stačí group by meno, aplikacia a na hodnotu dát max.
No to nejde, skôr by som potreboval niečo ako DISTINCT na jeden stĺpec.
Síce som to vyriešil, ale musím priznať, že to žiadna sláva nie je...

SELECT
`configs`.`name` AS `name`,
`configs`.`value` AS `value`,
IF( `applications`.`type_application`= 'plugin', `plugins`.`name`, `services`.`name`) AS `application`
FROM `edenus_configs` AS `configs`
LEFT JOIN `edenus_applications` AS `applications` ON `configs`.`application_id`= `applications`.`id`
LEFT JOIN `edenus_plugins` AS `plugins` ON `applications`.`type_id`= `plugins`.`id`
LEFT JOIN `edenus_services` AS `services` ON `applications`.`type_id`= `plugins`.`id`
WHERE
(`services`.`name`= 'blog' OR `services`.`name`= 'system' OR `plugins`.`name` IN( 'blogplugin'))
AND( `configs`.`user_id`= 1 OR `configs`.`user_id` IS NULL)
AND( `configs`.`group_id`= 1 OR `configs`.`group_id` IS NULL)
/* tu je tá finta, keďže meno konfigurácie je jedinečné (v spojení s user_id a group_id) a dodal som do tabuľky ďalší stĺpec priority, ktorého hodnoty môžu byť: 0 - globál, 1 - group, 2 - user. */
AND `configs`.`priority`= (SELECT MAX( `configs2`.`priority`) AS `priority` FROM `edenus_configs` AS `configs2` WHERE `configs`.`name`= `configs2`.`name`)

Takže prvými podmienkami sa získajú konfigurácie pre danú skupinu a užívateľa, a potom vnoreným selectom sa získa maximálna priorita.

Ale nie je to bohviečo, už pri malých dátach pri testovaní (20 - 30 hodnôt) to ide dosť pomaly :-( (asi 0.0045 sek) a tých premenných tam môže byť teda sakra veľa ... za hocijaký ďalší tip ďakujem, zatiaľ toto nechám ...
Toto téma je uzamčeno. Odpověď nelze zaslat.

0