Autor Zpráva
davef6
Profil
Dobrý den,
mám tento dotaz

SELECT uzivatele.online, uzivatele.id, uzivatele.prezdivka, profil_data.vek, profil_data.kraj, profil_data.pohlavi, profil_data.hl_foto FROM uzivatele left join profil_data on uzivatele.id=profil_data.id_uziv left join foto on uzivatele.id = foto.id_uziv WHERE $oddo $uz_online $p $kraj $poh ORDER BY hl_foto DESC, img_thumb DESC, vip DESC, prezdivka LIMIT $zacatek,$konec

který vypisuje data ze 3 tabulek......uzivatele, profil_data a foto, problém spočívá v tom, že to má vyhledávat uživatele (uzivatele), ukazovat to u nich údaje (profil_data) a jejich foto (foto), ale když dám vyhledat, tak se mi uživatel ukáže tolikrát kolik má fotek v tabulce foto. Mělo by se to dát eliminovat distinct, ale nevím jak to přesně použít. Děkuji za odpovědi
bob.99
Profil *
A co použít klausili GROUP BY ?
Mastodont
Profil
Co je "profil_data.hl_foto"? Hlavní foto? Pokud ano, tak bych už další tabulku foto vynechal, ne? Mmch, nechápu rozdělení údajů o uživateli do tabulek uzivatele a profil_data - věk, kraj, pohlaví, to jsou přece atributy uživatele stejně jako přezdívka.
davef6
Profil
ano profil_data.hl_foto je hlavní foto, bohužel jsou tabulky ne zrovna nejlépe navržené, tak se hlavní foto ukládá do tabulky profil_data. Já bych potřeboval do tohoto začlenit že pokud nebude hlavní foto tak se vybere poslední vložené foto z tabulky foto. Což už to provádí, jen mi to pouze dělá duplicitní hodnoty pokud je v tabulce foto více než 1 fotka. Zkoušel jsem to group by, ale bohužel se mi to nepovedlo rozchodit.
Mastodont
Profil
pokud nebude hlavní foto tak se vybere poslední vložené foto z tabulky foto
To je blbý návrh. První foto v tabulce fotky dát jako hlavní, uživateli případně dát i volbu určit jinou fotku jako hlavní. Do tabulky foto doplnit sloupec s příznakem, podle kterého by se hlavní fotka vybírala. Do tabulky profil bych žádné foto nedával.
WHERE foto.hlavni = 1 (true)
davef6
Profil
teď to mám podle Mastodonta a příznakem asi takto

SELECT foto.img_thumb, uzivatele.online, uzivatele.id, uzivatele.prezdivka, profil_data.vek, profil_data.kraj, profil_data.pohlavi FROM uzivatele left join profil_data on uzivatele.id=profil_data.id_uziv left join foto on uzivatele.id = foto.id_uziv WHERE $oddo $uz_online $p $kraj $poh ORDER BY foto.hl DESC, vip DESC, prezdivka LIMIT $zacatek,$konec

ale pořád je tam problém že pokud má uživatel víc fotek, tak se tam ukáže několikrát, což potřebuju odbourat, podle WHERE foto.hlavni = 1 (true) to nemohu udělat protože potřebuji ukázat i ostatní uživatele, kteří mají foto ,ale nemají nastavené hlavní foto (zobrazí se jim poslední vložené foto)
Kajman_
Profil *
Co to zkusit trošku jinak... kolerovaným poddotazem... možná takto nějak
SELECT (select foto.img_thumb
        from   foto
        where  uzivatele.id = foto.id_uziv
        order  by foto.hl desc, foto.id desc
        limit  1) img_thumb,
       uzivatele.online,
       uzivatele.id,
       uzivatele.prezdivka,
       profil_data.vek,
       profil_data.kraj,
       profil_data.pohlavi
FROM   uzivatele
left   join profil_data on uzivatele.id = profil_data.id_uziv
WHERE  $oddo $uz_online $p $kraj $poh
ORDER  BY vip DESC, prezdivka
LIMIT  $zacatek, $konec
davef6
Profil
tak bohužel toto nic nenajde, kontroloval jsem případné překlepy a tím to taky nebude
Kajman_
Profil *
Nenajde fotku a ostatní údaje vypíše, nebo nejsou splněné podmínky z where, které tam máte jako proměnné?
davef6
Profil
nevypíše vůbec nic........dobré bude asi když to tu víc rozvedu.....důležité věci:

if ($_POST['onl'] > '0') $uz_online = " and uzivatele.online = '1'";
if ($_POST['kraj'] > '0') $kraj = " and profil_data.kraj = '".addslashes($_POST["kraj"])."'";
if (!empty($_POST['p'])) $p = " and profil_data.pohlavi = '".addslashes($_POST["p"])."'";
if (!empty($_GET['p'])) $poh = " and profil_data.pohlavi = '".addslashes($_GET["p"])."'";
if ($_POST['od'] > '0' || $_POST['do'] > '0') $oddo = " profil_data.vek between ".addslashes($_POST["od"])." and ".addslashes($_POST["do"])."";

a pak tam je už toto známé

$prikaz = MySQL_Query("SELECT (select foto.img_thumb from foto where uzivatele.id = foto.id_uziv order by foto.hl desc, foto.id desc limit 1) img_thumb, uzivatele.online, uzivatele.id, uzivatele.prezdivka, profil_data.vek, profil_data.kraj, profil_data.pohlavi FROM uzivatele left join profil_data on uzivatele.id = profil_data.id_uziv WHERE $oddo $uz_online $p $kraj $poh ORDER BY uzivatele.vip DESC, uzivatele.prezdivka LIMIT $zacatek, $konec") or (mysql_error());
Kajman_
Profil *
Nechtěl jste si tu chybu vypsat, když k ní dojde? Třeba se dozvíte, že sloupec foto.id neexistuje a musíte si tam dosadit sloupeček podle svého návrhu.

or die(mysql_error());
davef6
Profil
děkuji, vyzkouším
davef6
Profil
už to funguje, jen malinko jinak než bych potřeboval:) potřeboval jsem vypsat napřed všechny uživatele, kteří mají hlavní foto, pak všechny uživatelé kteří mají foto a nemají hlavní foto a nakonec uživatele bez fotek
Kajman_
Profil *
A může to být na původní návrh, že je hlavní foto v profilu?
davef6
Profil
nejlepší by to bylo s tím hlavním fotem v příznaku, ale kdyby to jinak nešlo, tak je mi jedno jak hlavně když to pujde:) dneska už se s tím trápím celkem dlouho
davef6
Profil
dosadil jsem tam group by foto.id_uziv, ale vypíše to pouze uživatelé, kteří mají fotku a ty ostatní ne:(
Kajman_
Profil *
Možná by to šlo takto nějak. Nevím, jak to bude rychlé při velkém počtu obrázků.

select o.img_thumb,
       uzivatele.online,
       uzivatele.id,
       uzivatele.prezdivka,
       profil_data.vek,
       profil_data.kraj,
       profil_data.pohlavi
from   
(select f1.* from foto f1
 left join foto f2 on f1.id_uziv=f2.id_uziv
                      and (f1.hl<f2.hl or (f1.hl=f2.hl and f1.id<f2.id))
 where f2.id is null
) o
right  join uzivatele on uzivatele.id = o.id_uziv
left   join profil_data on uzivatele.id = profil_data.id_uziv
where  $oddo $uz_online $p $kraj $poh
order  by o.hl desc, vip desc, prezdivka
limit  $zacatek, $konec
davef6
Profil
díky, vyzkouším

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:

0