Autor Zpráva
MilanKarkulka
Profil
Mám následující tabulku:

auto | cena | výrobce
Z1 | 300 000 | BMW
Z2 | 350 000 | BMW
Z3 | 400 000 | BMW
A1 | 150 000 | AUDI
A2 | 170 000 | AUDI
A3 | 200 000 | AUDI

(1.) A já chci vypsat všechny unikátní výrobce. (2.) A rozmezí (min max) jejich cen.

Takže výsledek by byl takovýto:

BMW 300 000 - 400 000
AUDI 150 000 - 200 000

Já ten dotaz dokáži napsat. Ale pouze tak, že do jednoho SQL dotazu vložím další dva SQL dotazy. Což není asi moc OK, že?
juriad
Profil
Jde o jeden z nejjednodušších dotazů:
SELECT vyrobce, MIN(cena), MAX(cena)
FROM tabulka
GROUP BY vyrobce
MilanKarkulka
Profil
Děkuji. Ale ten tvůj SQL dotaz tedy moc nechápu.

Mohl by jsi ho prosím dosadit do této šablony? Především to echo... . Snad mi to dojde.

<?
$query=mysql_query("SELECT vyrobce, MIN(cena), MAX(cena) FROM tabulka GROUP BY vyrobce");
while ($vypis=mysql_fetch_array($query))
{
//echo: BMW 300 000 - 400 000
}
?>
juriad
Profil
<?php # používej vždy dlouhý otevírací tag
# varuji tě, funkce mysql_* už v nové verzi PHP neexistují, použij mysqli_* (liši se obvykle jedním parametrem navíc)
$query = mysql_query("SELECT vyrobce, MIN(cena) AS mincena, MAX(cena) AS maxcena FROM tabulka GROUP BY vyrobce"); # pojmenujeme si výstupy funkcí; název tabulky si doplň podle svého
while ($vypis = mysql_fetch_array($query))
{
  echo $vypis['vyrobce'] . ' ' . $vypis['mincena'] . ' - ' . $vypis['maxcena']; 
  # pokud vypisuješ do HTML stránky, tak ještě: htmlspecialchars($vypis['vyrobce'])
  # pokud bys chtěl oddělení po třech místech, tak použij funkci number_format.
}
?>
MilanKarkulka
Profil
Perfektní. Mockrát děkuji!

Na tvém prvním příkladu mě zmátlo, že tam nebylo AS mincena/AS maxcena. Nyní již chápu jak k těm hodnotám přistupovat.


Mohu se ještě zeptat, na které místo by se vkládalo WHERE? Pokud bych měl např. ještě další sloupec "skladem" a bral bych v úvahu pouze WHERE skladem=1.
juriad
Profil
juriad:
WHERE patří před GROUP BY, ale...
Pokud přidáš WHERE podmínku, tak se ti budou počítat jen ceny z věcí, které jsou skladem.
Pokud chceš pro každého výrobce vědět, kolik věcí od něj máš skladem, a sloupec skladem je pouze 0 nebo 1, pak stačí přidat do SELECTU:
SUM(skladem) AS pocetskladem
MilanKarkulka
Profil
juriad:
Vyřešeno. Děkuji za dokonalé odpovědi.
MilanKarkulka
Profil
Ahoj,
mám ještě jeden doplňující dotaz.

Šlo by udělat, aby jsem dostal pro minimální cenu i odpovídající značku auta (sloupec auto)?

Tj. že například u BMW by jsem vypsal nejenom že MIN(cena) je 300 000. Ale i to, že to nejlevnější auto se jmenuje Z1.

(jsem si vědomý toho, že více aut může mít stejnou cenu, ale to mi je jedno, beru kterékoliv z nich)
Kajman
Profil
SELECT mm.vyrobce,
       mm.mincena,
       mm.maxcena,
       Min(t.auto)                   minauto,
       Group_concat(DISTINCT t.auto) minautoall
FROM   (SELECT vyrobce,
               Min(cena) AS mincena,
               Max(cena) AS maxcena
        FROM   tabulka
        WHERE  skladem = 1
        GROUP  BY vyrobce) mm
       JOIN tabulka t
         ON mm.vyrobce = t.vyrobce
            AND mm.mincena = t.cena
            AND t.skladem = 1
GROUP  BY mm.vyrobce,
          mm.mincena,
          mm.maxcena 

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: