AND pro strukturu, kategorie – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

AND pro strukturu, kategorie – MySQL – Fórum – Programujte.comAND pro strukturu, kategorie – MySQL – Fórum – Programujte.com

 

peter
~ Anonymní uživatel
4016 příspěvků
19. 1. 2015   #1
-
0
-

Mam tabulku, treba struktura (kategorie)
id, sub
1,1
1,7
1,6
2,4
2,9
2,1
Potreboval bych vybrat vsechna id, ktera maji sub = 1 a 7, cili AND. Da se to napsat nejak jednoduse, kdyz mam seznam cisel nebo to musim rozepisovat
sub = 1 AND sub = 7.

Kdybych to chtel resit jako OR, tak bych to napsal
sub = 1 OR sub = 7 -- nebo
sub IN (1,7) -- a prave tohle bych potreboval pro AND, protoze poddotazem vybiram id na zaklade textoveho nazvu

V realnem kodu mam toto pro OR
$aut = ''.implode("* ",$searchtermsep).'*';
 AND ArtAut.AutAid IN (SELECT ax.`IDAuthor` FROM `Authors` ax WHERE MATCH(ax.secondname) AGAINST('".$aut."' IN BOOLEAN MODE))

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:204b:51...–
P
~ Anonymní uživatel
212 příspěvků
19. 1. 2015   #2
-
0
-

AND tento problem nevyresi, protoze podminka "sub = 1 AND sub = 7" neplati pro zadny zaznam.

Jestli dobre chapu zadani, tak by se melo vybrat id 1, protoze pro nej existuje zaznam se sub = 1 i zaznam se sub = 7.

To by bylo takto: 

SELECT id
FROM Kategorie
WHERE sub IN (1, 7)
GROUP BY id
HAVING COUNT(*) > 1	

za predpokladu, ze v tabulce je dvojice hodnot id + sub unikatni.

Nahlásit jako SPAM
IP: 85.93.116.–
peter
~ Anonymní uživatel
4016 příspěvků
19. 1. 2015   #3
-
0
-

Spis jsem to mozna spatne vysvetlil, neuvedl priklad.

SELECT id
FROM struktura
WHERE sub IN (1,7)

To vybere id = 1 a id =2.

Ja potrebuji, aby platilo sub = 1 a 7 soucasne. Cili by se to muselo napsat takovou silenosti jako 

SELECT id
FROM struktura s0
LEFT JOIN struktura s1 ON s1.id=s0.id
LEFT JOIN struktura s2 ON s2.id=s0.id
WHERE
s1.id = 1 AND s2.id = 7

Cemuz bych se rad vyhnul a obesel to elegantne, podobne, jako s tim IN. Protoze pak ten dotaz musim generovat pres PHP cyklem na pocet sub idecek (autoru).

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:204b:51...–
peter
~ Anonymní uživatel
4016 příspěvků
19. 1. 2015   #4
-
0
-

   

SELECT id
FROM Kategorie
WHERE sub IN (1, 7)
GROUP BY id
HAVING COUNT(*) > 1

Tohle udela podle mne to, ze to vybere vse, co ma 1 nebo 7, ale muze to mit treba jen 1. A pak to zgrupuje podle id. Takze vyslednekm budou dva radky, kde bude id 1 a 2. (jestli se nepletu)

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:204b:51...–
P
~ Anonymní uživatel
212 příspěvků
19. 1. 2015   #5
-
0
-

#4 peter
Proto pisu, ze to funguje za predpokladu, ze dvojice hodnot id, sub je unikatni.

V tom pripade, kdyz nejake id bude mit sub jen 1 a 7 ne, tak nebude platit podminka HAVING COUNT(*) > 1 a id se nevybere.

Nahlásit jako SPAM
IP: 85.93.116.–
P
~ Anonymní uživatel
212 příspěvků
19. 1. 2015   #6
-
0
-

Pokud kombinace hodnot id + sub neni unikatni, znamena to, ze mohou nastat pripady napr.

id sub
1 1
1 1
2 7
2 7

Pak by se vybraly id 1 i 2 => moje reseni by nefungovalo.

Nahlásit jako SPAM
IP: 85.93.116.–
peter
~ Anonymní uživatel
4016 příspěvků
19. 1. 2015   #7
-
0
-

Uz to resim nejak s tim having. Ale nejak se mi to divne zacykluje, kdyz tam tu cast pridam.
On, cely ten dotaz je takovej divnej, proto to prepisuji. To psal kolega a v php se to ruzne generuje po castech. Uz jsem par veci vyhodil pres LEFT JOIN. Strustru je provazani na strukturu oddeleni.
Bez te casti, jak je HAVING, to udela blik 0.3s. Samotny HAVING spustny udela blik 0.2s. Ale, kdyz se to pusti takto, tak mu cas nejak nestaci :)

 SELECT    articles.*
FROM      articles,
          artstru
LEFT JOIN (strustru AS s1,strustru AS s2)
ON        ( (
                              s1.referenceid=artstru.struaid
                    AND       (
                                        s1.referenceid=2))
          OR        (
                              s1.lowerid=artstru.struaid
                    AND       (
                                        s1.referenceid=2))
          OR        (
                              s1.lowerid=artstru.struaid
                    AND       (
                                        s2.higherid=2)
                    AND       s2.referenceid=s1.referenceid))
WHERE     r06_title IS NOT NULL
AND       artstru.artsid=articles.idarticle
AND       `articles`.`idarticle` IN
          (
                   SELECT   `aa`.`artaid`
                   FROM     `artaut` `aa`
                   WHERE    `aa`.`autaid` IN
                            (
                                   SELECT `aut`.`idauthor`
                                   FROM   `authors` `aut`
                                   WHERE  MATCH(`aut`.`secondname`) against('torok* urbanec* bakala* sramkova* goluchova* kotrlova* hledik* urbancova* novotny*' IN boolean mode))
                   GROUP BY `aa`.`artaid`
                   HAVING   count(*) >= 9 )
AND       publishdate>='2000-01-01'
AND       publishdate<='2015-12-31'
GROUP BY  articles.idarticle
ORDER BY  publishdate DESC 
Nahlásit jako SPAM
IP: 2001:718:2601:1f7:204b:51...–
Kit+15
Guru
19. 1. 2015   #8
-
0
-

#7 peter
To vypadá přímo strašně. Lepší by bylo předělat databázi z tohoto EAV do něčeho rozumnějšího, kde si vystačíš s obyčejným JOIN.

Také můžeš použít PostgreSQL, kde to snadno vyřeší hstore.

Nahlásit jako SPAM
IP: 37.48.38.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4016 příspěvků
20. 1. 2015   #9
-
0
-

 Problem je, ze mi to vrati nulu, ikdyz tam dam 2 autory a zmenim count > 8 na >1. Cili, kazdy ten sub-select da unikatni vysledky, ktere se neprolnou. Coz nesouhlasi :)

SELECT Articles.*
FROM Articles  
WHERE
  `Articles`.`IDArticle` IN
    (
    SELECT `IDArticle` FROM
      (
        (
        SELECT `aa`.`ArtAid` AS `IDArticle`
        FROM `ArtAut` `aa`
          LEFT JOIN `Authors` `aut` ON `aut`.`IDAuthor` = `aa`.`AutAid`
        WHERE
          MATCH(`aut`.`secondname`) AGAINST('torok* urbanec* bakala* sramkova* goluchova* kotrlova* hledik* urbancova* novotny*' IN BOOLEAN MODE)
        GROUP BY `aa`.`ArtAid`
        HAVING COUNT(*) > 8
      
        ) UNION (
      
        SELECT `ArtSid` AS `IDArticle`
        FROM `ArtStru`
          LEFT JOIN (StruStru AS S1,StruStru AS S2) ON
            (
              (S1.referenceid=ArtStru.StruAid AND ( S1.referenceid=2)) OR
              (S1.lowerid=ArtStru.StruAid AND ( S1.referenceid=2)) OR
              (S1.lowerid=ArtStru.StruAid AND ( S2.higherid=2) AND S2.referenceid=S1.referenceid)
            )
        GROUP BY `ArtSid`
        )
      ) AS `vyber`
    GROUP BY `IDArticle`
    HAVING COUNT(*) > 1
    )
  AND R06_title IS NOT NULL     
  AND publishdate>='2000-01-01' AND publishdate<='2015-12-31'
ORDER BY publishdate DESC
Nahlásit jako SPAM
IP: 2001:718:2601:1f7:d837:59...–
peter
~ Anonymní uživatel
4016 příspěvků
20. 1. 2015   #10
-
0
-

opraveno par drobnych chybicek. Predevsim, UNION v default nastaveni odmazava duplicity. Takze se musi pouzit UNION ALL. A zda se, ze to funguje :)

SELECT Articles.*
FROM Articles  
WHERE
  `Articles`.`IDArticle` IN
    (
    SELECT `IDArticle` FROM
      (
        (
        SELECT `aa`.`ArtAid` AS `IDArticle`
        FROM `ArtAut` `aa`
          LEFT JOIN `Authors` `aut` ON `aut`.`IDAuthor` = `aa`.`AutAid`
        WHERE
          MATCH(`aut`.`secondname`) AGAINST('torok* urbanec* bakala* sramkova*' IN BOOLEAN MODE)
        GROUP BY `aa`.`ArtAid`
        HAVING COUNT(*) > 3
      
        ) UNION ALL (
      
        SELECT `ArtSid` AS `IDArticle`
        FROM `ArtStru`
          LEFT JOIN (StruStru AS S1, StruStru AS S2) ON
            (
              (S1.referenceid=ArtStru.StruAid AND ( S1.referenceid=2)) OR
              (S1.lowerid=ArtStru.StruAid AND ( S1.referenceid=2)) OR
              (S1.lowerid=ArtStru.StruAid AND ( S2.higherid=2) AND S2.referenceid=S1.referenceid)
            )
        GROUP BY `ArtSid`
        )
      ) AS `vyber`
    GROUP BY `vyber`.`IDArticle`
    HAVING COUNT(*) > 1
    )
  AND R06_title IS NOT NULL     
  AND publishdate>='2000-01-01' AND publishdate<='2015-12-31'
ORDER BY publishdate DESC
Nahlásit jako SPAM
IP: 2001:718:2601:1f7:d837:59...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý