Autor Zpráva
urna
Profil *
Dobrý večer, už nějakou hodku se snažím docílit toho aby mi vypsal uživatele, které nemám v oblíbených. Zkoušim toho docílit takto:
$sql = mysql_query("SELECT us.nick FROM user us 
  JOIN oblibeny uz ON us.id = uz.id_oblibeneho 
  JOIN dodatek d ON uz.id_user = d.id_user 
  WHERE uz.id_oblibeneho != '10' AND uz.id_user = '10' AND uz.id_oblibeneho != us.id AND d.pritel = 1");
Furt mi ale vypisuje jen, když si ho vložím do oblíbených, ale já potřebuju pravej opak. Vidí prosím někdo, kde mám chybu? Děkuji

Ps: když odeberu toto AND uz.id_oblibeneho != us.id , tak vypisuje pravej opak a když tu podmínku nechám, tak nevypíše nic.
Alphard
Profil
Aby se zahrnuli i neoblíbení, musí tam být left join. Pak doplňte podmínku is null, abyste vyfiltroval oblíbené.
urna
Profil *
Můžete mi to prosím opravit v kodu? Přiznám se, že vůbec nechápu.
Alphard
Profil
LEFT JOIN oblibeny uz
Tohle by vám mělo vypsat všechny uživatele. Tu podmínku určitě zvládnete sám.
urna
Profil *
To bohužel nic nevypíše. Tedy mimo chyby: Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in
Alphard
Profil
Přidání LEFT by chybu způsobit nemělo, ovšem když se tak stalo, je třeba zjistit jakou Nejčastější potíže s PHP (FAQ) » Warning mysql_fetch_array() (nebo jiná MySQL funkce): supplied argument is not a valid MySQL result resource….
urna
Profil *
Ono spůsobilo chybu, že jsem vymazal i ON us.id = uz.id_oblibeneho Ted spekuluji nad tou podmínkou, ale pořád nemám ani představu jak by měla vypadat. Já používám snadné dotazy a tohle už je silně nad


Ale je to stejně špatně. Prasácky jen pro přehled jsem to vyřešil takhle:

  $vys = mysql_fetch_array(mysql_query("SELECT kraj FROM user WHERE id='".intval($id_uzivatel)."' AND ucet='user' AND pass='".mysql_real_escape_string($token)."'"),MYSQL_BOTH);
  $que = mysql_query("SELECT * FROM user WHERE id IN(SELECT DISTINCT id_user FROM user_dodatek WHERE id_user != '".intval($id_uzivatel)."' AND pritel='1') AND ucet='user' AND kraj='".$vys["kraj"]."'");
  while($ro = mysql_fetch_assoc($que)){
    if(mysql_result(mysql_query("SELECT COUNT(*) FROM oblibeny_uzivatele WHERE id_user='".intval($id_uzivatel)."' AND id_oblibeneho='".$ro["id"]."'"),0) == 0){
      $vysledky[] = $ro["id"];
    }
  }
  $vysledky = implode(",",$vysledky); 
  $kolik = mysql_result(mysql_query("SELECT COUNT(*) FROM user WHERE id IN(".$vysledky.")"),0);
Takhle to funguje super, ale je to pěkná prasárna. Proto to chci nahradit nějakým důstojným dotazem ale pořád se mi to nedaří.
Kajman
Profil
Pokud vynechám něco s tím dodatkem, tak to můžete napsat např. takto.

SELECT us.nick
FROM   user us
       LEFT JOIN oblibeny uz
              ON us.id = uz.id_oblibeneho
                 AND uz.id_user = 10
WHERE  us.kraj = '$kraj'
       AND us.is != 10
       AND uz.id_oblibeneho IS NULL
urna
Profil *
Takhle to vypada dobře. Snad zvládnu napojit ty další podmínky a zbavím se tý přešernosti.


Tak další průser. Když chci dodat vynechanou tabulku, tak mi to sice nevypíše chybu, ale prázdný výsledek

SELECT us.nick
FROM   user us
       LEFT JOIN oblibeny uz
              ON us.id = uz.id_oblibeneho
                 AND uz.id_user = 10
      JOIN user_dodatek d ON uz.id_user = d.id_user
WHERE  us.kraj = '$kraj'
       AND uz.id_oblibeneho IS NULL



Bude to znít blbě, ale můžu poprosit i o druhou část tabulky? Nějak se mi to vůbec nedaří skompletovat. Děkuju
Kajman
Profil
Ten přidaný left join udělá to, že zkusí najít příznak oblíbenosti aktuálním uživatelem (ale díky left joinu zachová data z tabulky user i když se k nim řádek v oblibenych nenajde). Podmínkou is null ve where se vyberou ty, které nebyly nalezeny. Proto nedává smysl hledat k nenalezeným řádkům spojení v dodatku.

Dodatek by šel připojit k tabulce user... tedy
ON us.id = d.id_user
plus přidat podmínku na sloupec pritel do where části. Ale takhle zběžně jsem nepochopil význam dodatkové tabulky, takže to nemusí být hledané řešení.
urna
Profil *
Dodatkové řešení je pro to aby ve výsledku nebyl tázající uživatel a zaroveň musí souhlasit.


nic co tam je není navíc. Sice je to prasácky napsaný, ale vše tam má svůj význam. Ono přesně jak to mám teď je to perfektně funkční, ale taky dost náročný proces dotazu. Navíc nevzhledný :-)


proto se snažím to dát do jednoho dotazu. Ten kod sice není viditelný, ale pro můj dobrý pocit.


Dobrý už jsem to vyřešil. Stačilo se trošku zamyslet :-) Děkuju moc
urna
Profil *
Jenom mi nejde do hlavy poslední věc a to je ta, že mi vypisuje jinýho uživatele, ale já mám stejné nastavení. Chová se to přesně jak potřebuju, ale měl by vypsat i muj nick protože tam nikde nemám podmínku, že můj má ignorovat.

$sql = mysql_query("SELECT us.nick FROM user us LEFT JOIN oblibeny_uzivatele uz ON us.id = uz.id_oblibeneho RIGHT JOIN user_dodatek d ON us.id = d.id_user WHERE us.kraj='".$vys["kraj"]."' AND d.pritel='1' AND uz.id_oblibeneho IS NULL");

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: