Autor Zpráva
Manny
Profil *
Ahoj, mám 2 tabulky, v jedné mám mimo jiné názvy měst a ve druhé opět mimo jiné PSČ. Následující dotazem si vytáhnu PSČ k daným městům:
'SELECT mesto.* FROM mesta JOIN mesta_psc ON mesto.id=mesta_psc.item WHERE region=8 ORDER BY mesta_psc.psc desc

- tohle funguje správně. A teď se to snažím upravit pro stránkování - LIMIT:
'SELECT mesto.* FROM mesta JOIN mesta_psc ON mesto.id=mesta_psc.item WHERE region=8 ORDER BY mesta_psc.psc desc LIMIT 0,20


Teď mi to s LIMITem vypíše úplně jiný počet výsledků než v prvním případě - myslím si, že je to tím, že záznamy nejsou v tabulce v řádcích hned za sebou, a proto mi to např. místo 30ti záznamů vyhodí pouze 9. (čili vybere mi to těch 9 záznamů, které jsou mezi řádky 0 - 20 -myslím teda).

Nevíte, jak by se tady tohle dalo obejít / vyřešit?
Alphard
Profil
Limit by neměl filtrovat sadu výsledků jinak než osekáním podle počtu.
Jestliže první dotaz vypíše 30 záznamů, tak druhý by jich měl vypsat 20. Skutečně ty dotazy vypadají přesně takhle?

myslím si, že je to tím, že záznamy nejsou v tabulce v řádcích hned za sebou, a proto mi to např. místo 30ti záznamů vyhodí pouze 9. (čili vybere mi to těch 9 záznamů, které jsou mezi řádky 0 - 20 -myslím teda).
To snad není možné.

V dotazu nemáte u regionu specifikovánu tabuku, která se má použít. Doplňte to.
Manny
Profil *
Alphard
tabulku u regionu jsem doplnil, nicméně výsledek pořád stejně negativní :/

Ano, vypadají přesně takhle - když odstraním LIMIT z dotazu, výsledek (počet záznamů) je správný, jakmile jej tam ale dám, vypíše se málo záznamů...

Když jsem si tento dotaz ale pustil v phpmyadminovi, vypsal mi správný počet záznamů... nevím kde by mohla být chyba, obsahy proměnný jsou správně (vypsal jsem si je)
Kajman_
Profil *
Tak to máte asi chybu při vypisování v aplikaci.
Joker
Profil
Manny:
Jak vypadá kód, který výsledek vypisuje?
Manny
Profil *
Kajman_
Joker
Co tím myslíte? Napadlo mě, že to bude asi tady, ale nevidím ten problém... :/

Jinak když tahám data ze dvou tabulek, tak při výpisu musím používat $zaznam['psc'] nebo $zaznam['mesta_psc.psc'] - psát tam i název tabulky? Zatím používám ten první způsob, tak jestli tam nebude ten problém
Alphard
Profil
Manny:
Co tím myslíte? Napadlo mě, že to bude asi tady, ale nevidím ten problém... :/
A ukážete nám ten kód? (pouze ten podstatný, nekopírujte sem 50 řádků stylopisu apod.)
Manny
Profil *
Alphard
Zde přikládám:

$a=mysql_query('SELECT mesto.* FROM mesta JOIN mesta_psc ON mesto.id=mesta_psc.item WHERE region=8 ORDER BY mesta_psc.psc desc LIMIT 0,20');

while($z=mysql_fetch_array($a))
{
  echo 'Mesto: '.$z['mesto'].'<br>';
}


takhle mi to vypíše jen nějaký omezený výpis, když města s LIMITem řadím podle jejich PSČ. Bez LIMITu se vypíší všechna... je to úplně obyčejně uděláno, ořezal jsem ten skript úplně na minimum a i takhle mi to dělá pořád problémy...
Alphard
Profil
Hmm, to nám moc nepomůže. Co vypíše tohle?

$a=mysql_query('SELECT mesto.* FROM mesta JOIN mesta_psc ON mesto.id=mesta_psc.item WHERE region=8 ORDER BY mesta_psc.psc desc LIMIT 0,20');

echo mysql_num_rows($a);

while($z=mysql_fetch_array($a))
{
  echo 'Mesto: '.$z['mesto'].'<br>';
}
Manny
Profil *
Alphard
no sakryš nic to nevypíše! ani když odstraním ten LIMIT
Manny
Profil *
Alphard
Ale jak to může být špatně v aplikaci? Kde tam může být chyba? ...vždyť ten výpis přece nemá co ovlivnit, ne? ...píšu to možná takhle "hloupě", protože se mi nic podobného nestalo
Alphard
Profil
Takže jaký je teď stav? Nevypíšou se žádné řádky a ani není vypsáno žádné číslo reprezentující počet řádků? Změnil jste od rána něco jiného? Jste správně připojen k databázi? Vypisuje něco mysql_error()? Když ten dotaz spustíte v phpMyAdminovi, tak je vše v pořádku?
Manny
Profil *
měl jsem u toho num_rows chybu, nyní už jde, a přišel jsem k následujícím výsledkům:
$a=mysql_query('SELECT mesto.* FROM mesta JOIN mesta_psc ON mesto.id=mesta_psc.item WHERE region=8 ORDER BY mesta_psc.psc desc LIMIT 0,20');


tady mi to vypíše tolik záznamů (řádků), kolik je horní mez, tzn. že kdy mám LIMIT 0,20, vypíše mi mysql_num_rows 20 řádků, když LIMIT 0,50, vypíše 50 řádků...

naproti tomu jsem to zkusil u takového dotazu:
'SELECT * FROM mesta WHERE region=8 AND status=1 ORDER BY mesto desc LIMIT 0,50'


tak mi to vypsalo 35 záznamů - přesně tolik, kolik je potřeba

no tak se to jaksi zamotává :/
Alphard
Profil
Manny:
tady mi to vypíše tolik záznamů (řádků), kolik je horní mez
To je správně.

tak mi to vypsalo 35 záznamů - přesně tolik, kolik je potřeba
Nevím, kolik jich bylo potřeba, ale jestli podmínky dotazu splňuje právě 35 záznamů, tak je to správně.

no tak se to jaksi zamotává :/
Nemyslím :-) Počet následně vypsaný dotazů v cyklu musí být stejný jako počet záznamů vrácených databází a vše je ok, nebo ne?
Manny
Profil *
Alphard
už možná vím čím to bude - když mám např. město PRAHA - má několik částí (PRAHA 1, PRAHA 2,..) a já mám všechny Prahy pod stejným ID, takže potřebuju použít DISTINCT na to ID, akorát nevím jak jej v takovém případě použív, když tam mám
SELECT mesto.* FROM mesta ...
Alphard
Profil
Manny:
Cyklus musí vypsat shodný počet záznamů jako mysql_num_rows() bez ohledu na duplicity. Navíc si nejsem jist, jestli hledáte zrovna distinct.
Manny
Profil *
Alphard
no když mám např. 3x ID=144, tak distinct mi to vytřídí na na 1 výsledek, nikoli 3, ne? ...a já nevím, jak to zapsat, když tam mám mesto.* - a potřebuju tam přidelat DISTINCT(id)
Alphard
Profil
Manny:
když mám např. 3x ID=144, tak distinct mi to vytřídí na na 1 výsledek, nikoli 3, ne?
Ano, ale co ostatní sloupce?
Manny
Profil *
Alphard
jak co ostatní sloupce? to vyřadí přece ty duplicitní řádky, ne?
Manny
Profil *
Alphard
když použiju ten DISTINCT, tak mi zbyde opravdu těch 35 záznamů, ale zruším tím ostatní sloupce a ty potřebuju zanechat :/
Manny
Profil *
Alphard
neuvěřitelné, už to chodí :))))))
'SELECT DISTINCT mesto.* FROM mesta JOIN mesta_psc ON mesto.id=mesta_psc.item WHERE region=8 ORDER BY mesta_psc.psc desc LIMIT 0,20'

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: