Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Dotaz sql

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Dotaz sql

Autor: peta1 ♂

8:35:27 13.08.2012

"Mam tri tabulky napr."
Ne napr. Proste posli konkretni nazvy sloupcu z konkretnich nazvu tabulek. Pak ti bude P schopen napsat presny dotaz.

zeme
id_zeme | nazev

mesto
id_mesto | nazev | id_zeme

dum
id | c. popisne | id_mesto

Zopakuji to, co ti P napsal trosku jinak. Treba pochopis potize s tim ti poradit.
g.name - v seznamu sloupcu, co jsi vypsal se zadne nejmenuje "name"
g.name - zadna z tabulek se nejmenuje "g" a ani v dotazu neni alias pro zadnou tabulku pojmenovany jako "g"
u.id - totez pro "u"
FROM dum
FROM dum u -- to bys musel mit tady rekneme u
SELECT u.id, g.name FROM mesto
SELECT u.id, g.name FROM mesto g -- a tady rekneme g
Ale nevim, ktera tabulka je ktera.
A minulje jsem ti psal, ze
zeme.nazev =\'francie\' OR zeme.nazev =\'anglie\'
z.nazev IN ('anglie', 'francie') -- muzes nahradit timto
z.nazev IN ('Anglie', 'Francie') -- ty jsi pouzil toto, ale aspon mas uvezene, co znamena "z" (INNER JOIN zeme z)
Co se mi na tom nezda? Velikost pismen. IN nahrazuje to spojeni OR, ale oboje nefunguje jako LIKE. Cili, pokud mas v databazi napsana jmena zemi malyma, pak pro OR i IN to musi byt malyma. Nebo bys to musel prepsat na LIKE.

Co, kdyby sis pripravil takovy maly textovy soubor s 10 radky z kazde tebulky, mysql dump i s create table? Pak tu das odkaz a muzeme si to zkouset na konkretnich udajich. Teda v pripade, ze se ti to nejdriv nepovede rozchodit podle sql dotazu od P.

Citovat příspěvek

 

Re: Dotaz sql

Autor: P ♂

14:34:51 07.08.2012

SantaClaus napsal/a

Mam tri tabulky napr.

zeme
id_zeme | nazev

mesto
id_mesto | nazev | id_zeme

dum
id | c. popisne | id_mesto

A nasledujicim dotazem ziskam pocet mest pro urcitou zemi


SELECT count(*)
FROM dum
JOIN ( SELECT u.id, g.name
FROM mesto JOIN zeme
ON mesto.id_zeme= zeme.id_zeme
WHERE mesto.nazev =\'praha\'
) AS x
ON dum.id_mesto = x.id_mesto

Njn ale co kdyz chci spocitat mesta z vice zemi? Nasledujici prikaz nefunguje:

SELECT count(*)
FROM dum
JOIN ( SELECT u.id, g.name
FROM mesto JOIN zeme
ON mesto.id_zeme= zeme.id_zeme
WHERE zeme.nazev =\'francie\' OR
zeme.nazev =\'anglie\'
GROUP BY zeme.nazev
) AS x
ON dum.id_mesto = x.id_mesto

Jaka tam je finta?



Komu neni rady, tomu neni pomoci.
1. k spocitani poctu mest v zemich k nicemu nepotrebujes domy
2. druhy dotaz nemuze fungovat z nekolika duvodu
- pouzivas u.id, g.name, ale u ani g neni nazev zadne tabulky ani aliasu v dotazu
- sloupec name se v zadne tabulce nevyskytuje
- subselect x neobsahuje sloupec id_mesto, pres ktery se ho snazis spojovat s domy
3. muj druhy select by ti mel vratit co pozadujes. Ovsem nevim co obsahuji Tvoje data.

Citovat příspěvek

 

Re: Dotaz sql

Autor: SantaClaus ♂

20:13:59 06.08.2012

P napsal/a

Finta v tom neni zadna, staci pouzivat hlavu a naucit se elementarni zaklady dotazovaciho jazyka SQL.
Kdyz chci zjistit pocet mest pro urcitou zemi, nepotrebuji k tomu pocty domu v mestech a nebudu to omezovat podminkou, ze nazev mesta je Praha.

Pocet mest pro urcitou zemi:

SELECT z.nazev, COUNT(*) AS pocet_mest
FROM
mesto m
INNER JOIN zeme z ON z.id_zeme = m.id_zeme
WHERE
z.nazev = 'Anglie'
GROUP BY z.nazev

Spocitat mesta pro vice zemi:

SELECT z.nazev, COUNT(*) AS pocet_mest
FROM
mesto m
INNER JOIN zeme z ON z.id_zeme = m.id_zeme
WHERE
z.nazev IN ('Anglie', 'Francie')
GROUP BY z.nazev



JJ to umim, jenze ja jsem ten prvni dotaz spatne napsal, spletl jsem si mesto se zemema, spravne to ma bejt:

SELECT count(*)
FROM dum
JOIN ( SELECT u.id, g.name
FROM mesto JOIN zeme
ON mesto.id_zeme= zeme.id_zeme
WHERE zeme.nazev ='anglie'
) AS x
ON dum.id_mesto = x.id_mesto

Ale tenhle dotaz funguje spravne, byl orientacni, problem byl s tim druhym. Chci aby vysledek byl :

anglie | 109
francie | 103

misto toho mi to da
null | null

Citovat příspěvek

 

Re: Dotaz sql

Autor: P ♂

15:01:54 06.08.2012

Finta v tom neni zadna, staci pouzivat hlavu a naucit se elementarni zaklady dotazovaciho jazyka SQL.
Kdyz chci zjistit pocet mest pro urcitou zemi, nepotrebuji k tomu pocty domu v mestech a nebudu to omezovat podminkou, ze nazev mesta je Praha.

Pocet mest pro urcitou zemi:

SELECT z.nazev, COUNT(*) AS pocet_mest
FROM
mesto m
INNER JOIN zeme z ON z.id_zeme = m.id_zeme
WHERE
z.nazev = 'Anglie'
GROUP BY z.nazev

Spocitat mesta pro vice zemi:

SELECT z.nazev, COUNT(*) AS pocet_mest
FROM
mesto m
INNER JOIN zeme z ON z.id_zeme = m.id_zeme
WHERE
z.nazev IN ('Anglie', 'Francie')
GROUP BY z.nazev

Citovat příspěvek

 

Re: Dotaz sql

Autor: peta1 ♂

10:45:28 06.08.2012

Ja moc sql dotazy neumim, ale treba ti to pomuze. Tady mam v jednom projektu dotaz, ktery vytahne vsechny projekty , autory a konference. Treba upravenim ne SELECT COUNT bys dostal to, co chces.

SELECT a.*,
(SELECT GROUP_CONCAT(CONCAT(a2.`secondname`,' ',a2.`firstname`) SEPARATOR ', ')
FROM `ArtAut` a1
LEFT JOIN `Authors` AS a2 ON a2.`IDAuthor` = a1.`AutAid`
WHERE a1.`ArtAid` = a.`IDArticle`
GROUP BY a1.`ArtAid`
ORDER BY CONCAT(a2.`secondname`,' ',a2.`firstname`) ASC) AS authors,
(SELECT GROUP_CONCAT(CONCAT(p2.`identification`,': ',p2.`fullname`) SEPARATOR ';\n ')
FROM `ArtPro` p1
LEFT JOIN `Projects` AS p2 ON p2.`IDProject` = p1.`ProAid`
WHERE p1.`ArtPid` = a.`IDArticle`
GROUP BY p1.`ArtPid`
ORDER BY p2.`identification` ASC) AS projects,
(SELECT GROUP_CONCAT(CONCAT(c2.`title`,' (',c2.`R62`,')') SEPARATOR ';\n ')
FROM `ArtCon` c1
LEFT JOIN `Conferences` AS c2 ON c2.`IDConference` = c1.`ConAid`
WHERE c1.`ArtCid` = a.`IDArticle`
GROUP BY c1.`ArtCid`
ORDER BY c2.`title` ASC) AS conferences
FROM `Articles` a
WHERE `IDArticle`=%s
",$id); // -- c2.link
Vysledek pak vypada takto:
http://nora.fpf.slu.cz/setc/publist_detail.php?id=368

Toto je pekna vecicka na parsovani sql dotazu:
http://www.dpriver.com/pp/sqlformat.htm

>zeme.nazev = 'francie'
> OR zeme.nazev = 'anglie'
zeme.nazev IN ('francie','anglie')

>SELECT u.id,
> g.name
> FROM mesto
> JOIN zeme
> ON mesto.id_zeme = zeme.id_zeme
> WHERE zeme.nazev = 'francie'
> OR zeme.nazev = 'anglie'
> GROUP BY zeme.nazev) AS x
SELECT
u.id,
g.name
FROM
mesto,
zeme
WHERE
mesto.id_zeme = zeme.id_zeme AND
zeme.nazev IN ('francie','anglie')
GROUP BY
u.id,
g.name
Zkus si dat do phpmyadmina tento dotaz, jaky vyhodi vysledek. Ale za nic nerucim. Musel bych mit create table a nejaka data a zkouset si to.

Citovat příspěvek

 

Dotaz sql

Autor: SantaClaus ♂

15:24:16 05.08.2012

Mam tri tabulky napr.

zeme
id_zeme | nazev

mesto
id_mesto | nazev | id_zeme

dum
id | c. popisne | id_mesto

A nasledujicim dotazem ziskam pocet mest pro urcitou zemi


SELECT count(*)
FROM dum
JOIN ( SELECT u.id, g.name
FROM mesto JOIN zeme
ON mesto.id_zeme= zeme.id_zeme
WHERE mesto.nazev =\'praha\'
) AS x
ON dum.id_mesto = x.id_mesto

Njn ale co kdyz chci spocitat mesta z vice zemi? Nasledujici prikaz nefunguje:

SELECT count(*)
FROM dum
JOIN ( SELECT u.id, g.name
FROM mesto JOIN zeme
ON mesto.id_zeme= zeme.id_zeme
WHERE zeme.nazev =\'francie\' OR
zeme.nazev =\'anglie\'
GROUP BY zeme.nazev
) AS x
ON dum.id_mesto = x.id_mesto

Jaka tam je finta?

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: