Virtuál se správou na 4 měsíce za super cenu. AKCE: 1 + 3 měsíce zdarma.
Zobrazují se odpovědi 1 až 11 z 11

Pouzivani vnorenych selectu

  1. Dobry den ,

    mam otazku mam nekolik vnorenejch selectu v sql

    select
    column
    column1
    ,(SELECT ....) as nazev
    FROM table

    a potrebuji pouzit nazev v klauzule where , napr where nazev > 10 no v pripade ze to tak udelam tak mi to vypise ze neexistuje sloupec, i kdyz sloupec neexistuje ale byl vytvoren alias, nevite poradit jak v takovem pripade pouzivat tyto aliasi abych nemusel psat dalsi select ?
    Dekuji

  2. Je opravdu potřeba používat takhle vnořený select? Nejde to udělat přes nějaký JOIN? Tohle dá DB serveru docela zabrat.

  3. Bohuzel ano jde o jednotlive data ktere vypocitavaji procenta ukazka toho selectu :

    select pro user_percent je tam proto protoze mi nefunguje ani scitani aliasu.



    Kód:
    $sql = "
                SELECT
                     id
                    ,CONCAT(forename, ' ', surname) AS name
                    ,birthdate
                    ,avatar
                    ,( (SELECT COUNT(id) FROM wc_forms_assign WHERE user_id = wc_user.id $clause)/((SELECT COUNT(id) FROM wc_forms_assign WHERE user_id = wc_user.id)/100) ) as `percent_interest`
                    ,(SELECT address FROM wc_user_profile WHERE user_id = wc_user.id) as address
                    ,( ( (SELECT COUNT(id) FROM wc_user_mbti WHERE user_id = wc_user.id AND (first = {$this->mbti['first']} OR first = 'X'))
                    +(SELECT count(id) FROM wc_user_mbti WHERE user_id = wc_user.id AND (second = {$this->mbti['second']} OR second = 'X'))
                    +(SELECT count(id) FROM wc_user_mbti WHERE user_id = wc_user.id AND (third = {$this->mbti['third']} OR third = 'X'))
                    +(SELECT count(id) FROM wc_user_mbti WHERE user_id = wc_user.id AND (quad = {$this->mbti['quad']} OR quad = 'X'))  )/(4/100)  ) as `mbti`
                    ,( ( (SELECT COUNT(id) FROM wc_forms_assign WHERE user_id = wc_user.id $clause)/((SELECT COUNT(id) FROM wc_forms_assign WHERE user_id = wc_user.id)/100)
                    +( (SELECT COUNT(id) FROM wc_user_mbti WHERE user_id = wc_user.id AND (first = {$this->mbti['first']} OR first = 'X'))
                    +(SELECT count(id) FROM wc_user_mbti WHERE user_id = wc_user.id AND (second = {$this->mbti['second']} OR second = 'X'))
                    +(SELECT count(id) FROM wc_user_mbti WHERE user_id = wc_user.id AND (third = {$this->mbti['third']} OR third = 'X'))
                    +(SELECT count(id) FROM wc_user_mbti WHERE user_id = wc_user.id AND (quad = {$this->mbti['quad']} OR quad = 'X'))  )/(4/100) )/3 ) AS             `user_percent`
                FROM
                    wc_user
            ";

  4. První reakce ... tak tohle je opravdu hodně velká prasárna, tebe bych nechtěl mít na psaní SQL ...

    dej mi chvilku na druhou reakci, až si tu hrůzu projdu

    ---------- Příspěvek doplněn 02.11.2011 v 17:40 ----------

    Můžeš mi zkusit vysvětlit co to tam vlastně počítáš? A máš představu jak strašně moc nečím takovýmhle zatížíš i v případě že to máš dobře indexované?

    Zatím se v tom moc neorientuju, ale pokud používáš count pro určitého Usera podle jeho ID není jednodušší pomocí triggeru mít u usera uloženou předpočítanou hodnotu pro wc_forms_assign a wc_user_mbti?

  5. Uvedomuji si ze je to prasarna no premyslel jsem pri psani na hodne moznosti jedina normalni na kterou jsem prisel je tahle, takze proto takova prasarna zatim , nez najdu jina reseni.

    ---------- Příspěvek doplněn 02.11.2011 v 17:43 ----------

    Pro lepsi pochopeni,

    v tomto selectu musim dostat z ostatnich tabulek vyhodnoceni a hned vypocitat % shodu danych dat pro mbti a take pro interests tyto data jsou ulozeny v jinnych tabulkach, pak vyhodnoceni celkoveho poctu 3 hodnot takze maximalni pocet je 300 % jedna z hodnot muze mit maximalne 100% coz je celkovy vypocet by mel byt v user_percent ktery by se mel dat pouzit do WHERE klauzuly , no z duvodu ze je to AS to asi nepujde a hledam moznost jak to udelat mimo ty vnorene selecty

  6. minimálně jeden vnoreny dotaz na address není potřeba to jde řešit přes JOIN

    Kód:
    SELECT wu.id, CONCAT(wu.forename, ' ', wu.surname) AS name, wu.birthdate, wu.avatar, wup.address as address 
    FROM wc_user wu JOIN wc_user_profile wup ON wu.id = wup.user_id
    Zbytku ještě stále nerozumím, vysvětlit co vlastně počítáš

    ---------- Příspěvek doplněn 02.11.2011 v 17:45 ----------

    Ideálně popiš výpočetní logiku toho algoritmu, z čeho vycházíš, co k čemu kde sčítáš a proč a co z toho má vylézt

  7. Když pominu, že model Myer-Briggs je překonaný modelem Big Five, tohle vypadá na chybně navrženou databázi a/nebo postup.

    Zkuste si ta data předpočítat při vkládání a změně uživatele.
    A hlavně se pořádně zamyslete nad tím, co děláte. Ten dotaz, stejně jako názvy tabulek a sloupců, jsou velmi nesrozumitelné. To poukazuje na to, že tomu, co algoritmizujete, úplně nerozumíte.

  8. Kód:
    ( (SELECT COUNT(id) FROM wc_forms_assign WHERE user_id = wc_user.id $clause)/((SELECT COUNT(id) FROM wc_forms_assign WHERE user_id = wc_user.id)/100) ) as `percent_interest`
    Tady je vypocet procent pro zajmy tento udaj se musi take zobrazovat ve vypisu takze tady se vypocita zdali uzivatele maji spolecne zajmy v % takze pocet celkovych spolecnych zajmu uzivatele na danem radku s uzivatelem prihlasenym / celkovy pocet zajmu daneho uzivatele na danem radku / 100

    Kód:
     ( (SELECT COUNT(id) FROM wc_user_mbti WHERE user_id = wc_user.id AND (first = {$this->mbti['first']} OR first = 'X'))
                    +(SELECT count(id) FROM wc_user_mbti WHERE user_id = wc_user.id AND (second = {$this->mbti['second']} OR second = 'X'))
                    +(SELECT count(id) FROM wc_user_mbti WHERE user_id = wc_user.id AND (third = {$this->mbti['third']} OR third = 'X'))
                    +(SELECT count(id) FROM wc_user_mbti WHERE user_id = wc_user.id AND (quad = {$this->mbti['quad']} OR quad = 'X'))  )/(4/100)  ) as `mbti`
    tady jde o vypocet testu osobnosti v % muzou to byt hodnoty 0,25,50,75,100% dle jednotlivych pismen PISMENO X znaci ze muze mit jedno i druhe pismeno pismena jsou

    ulozena v sloupcich first,second,third,quad dle toho se vypocita shoda v % narp ISXJ bude mit 100% shodu s ISFJ a 75% shodu s BSFJ

    tady je taky potreba tento zaznam vypsat.

    Kód:
    ,( ( (SELECT COUNT(id) FROM wc_forms_assign WHERE user_id = wc_user.id $clause)/((SELECT COUNT(id) FROM wc_forms_assign WHERE user_id = wc_user.id)/100)
                    +( (SELECT COUNT(id) FROM wc_user_mbti WHERE user_id = wc_user.id AND (first = {$this->mbti['first']} OR first = 'X'))
                    +(SELECT count(id) FROM wc_user_mbti WHERE user_id = wc_user.id AND (second = {$this->mbti['second']} OR second = 'X'))
                    +(SELECT count(id) FROM wc_user_mbti WHERE user_id = wc_user.id AND (third = {$this->mbti['third']} OR third = 'X'))
                    +(SELECT count(id) FROM wc_user_mbti WHERE user_id = wc_user.id AND (quad = {$this->mbti['quad']} OR quad = 'X'))  )/(4/100) )/3 )
    Zde v tomto selectu se maji vypocitat hodnoty interest_percent+mbti takze shoda v % interest_percent + shoda v % mbti a bude tam jeste jedna shoda v % na kolik % se shoduje tento celek , max % je 300

  9. Ufff, tak přestože nechápu proč to takhle počítáš a jak, tak pokud bych se držel toho že musíš dělat takhle COUNTy z nějakého důvodu, tak tohle je mnohonásobně míň zatěžující SQL dotaz

    Kód:
    SELECT
    wu.id, CONCAT(wu.forename, ' ', wu.surname) AS name, wu.birthdate, wu.avatar, wup.address as address
    ,( f1.p1/(f2.p2/100) ) as `percent_interest`
    ,( ( f3.p3 + f4.p4 + f5.p5 + f6.p6  )/(4/100)  ) as `mbti`
    ,( ( f1.p1/(f2.p2/100) + ( f3.p3 + f4.p4 + f5.p5 + f6.p6  )/(4/100) )/3 ) AS `user_percent`
    FROM
       wc_user wu 
       JOIN 
       wc_user_profile wup 
       ON wu.id = wup.user_id 
       JOIN                
       (SELECT COUNT(id) as p1, user_id FROM wc_forms_assign WHERE $clause GROUP BY user_id) f1
        on wu.id = f1.user_id
       JOIN
       (SELECT COUNT(id) as p2, user_id FROM wc_forms_assign GROUP BY user_id) f2
        on wu.id = f2.user_id
       JOIN
       (SELECT COUNT(id) as p3, user_id FROM wc_user_mbti WHERE (first = {$this->mbti['first']} OR first = 'X') GROUP BY user_id) f3
        on wu.id = f3.user_id
       JOIN
       (SELECT count(id) as p4, user_id FROM wc_user_mbti WHERE (second = {$this->mbti['second']} OR second = 'X') GROUP BY user_id) f4
        on wu.id = f4.user_id
       JOIN
       (SELECT count(id) as p5, user_id FROM wc_user_mbti WHERE (third = {$this->mbti['third']} OR third = 'X') GROUP BY user_id) f5
        on wu.id = f5.user_id
       JOIN
       (SELECT count(id) as p6, user_id FROM wc_user_mbti WHERE (quad = {$this->mbti['quad']} OR quad = 'X') GROUP BY user_id) f6
        on wu.id = f6.user_id
    Dalo to dost práce takže +bod potěší, případně mi můžeš na www.duben.org poslat jako poděkování něco na paypal ;)

  10. Rozumim tomu co chci udelat, nebo co algoritmizuji , tabulky jsou nazyvany dle modelu systemu system je navrzen v MVC struktura velice podobna zendu ,

    takze napr

    /libary/Wc(WebControl modely spolecne pro modul CMS a taky WEB)/User.php(model obsluhujici INSERT UPDATE a nacteni 1 radku z tabulky) - bude mit tabulku wc_user
    a
    /libary/Wc/User/List.php(jedna se o nacitani seznamu z tabulky wc_user)
    pak
    /libary/Wc/User/Assign.php bude mit tabulku wc_user_assign

    takze nazvy tabulek jsou delany dle nazvu a cesty k danym kontrolerum.

    viz vrch tridy:
    Kód:
    class Wc_User_List extends Core_List_Abstract
    {
        protected $_modelName = 'Wc_User';
    
        protected $_order = array(
            'mbti'      => 'mbti'
        );
        protected $_filter = array(
            'mbti'              => null
           ,'percent_interest'  => null
           ,'user_percent'      => null
        );

  11. Tak teď jsem si přečetl to co jsi k tomu napsal jak popis algoritmu a souhlasím s Martinem, že na to jdeš nejspíš špatně, na míru shody textových stringů jsou v DB funkce. Porovnat počet záznamů z jedné a druhé tabulky jde taky jinak a hlavně je u nečeho takového otázka proč to cpát všechno do jednoho dotazu. Děláš to pro několik tisíc lidí najednou takže to chceš udělat na 1 dotaz (v tom případě přetížíš tím co máš server, tím co jsem poslal já to nebude tak zlé)

    Otázka je co je tvým cílem, porovnat 2 zadané lidi ... pak to jde řešit na 3-4 kroky a nepřetěžovat DB, nebo to chceš tak že zadáš 1 člověka a k němu srovnáváš všechny v DB a chceš vrátit 1 nebo X odpovídajících lidí. Pak se má jít cestou omezování množiny tak, že v prvním kroku omezím výslednou množinu nejvíc vymezující podmínkou a postupně snižuji výsledek (to je algoritmická věc, hlavně takhle nezačni hned psát SQL)

Podobná témata

  1. Odpovědí: 7
    Poslední příspěvek: 08.10.2011, 19:25
  2. Regexp html selectu
    By Inkode in forum PHP
    Odpovědí: 0
    Poslední příspěvek: 11.04.2011, 23:47
Hostujeme u Server powered by TELE3