Autor Zpráva
freeTel
Profil *
Dobré ráno, chci se zeptat zkušenějších jak vypsat pouze jeden záznam? Mám dvě tabulky chci filtrovat podle města. Problém je, že mi vypisuje i záznam co spadá do jiného města. V jedné tabulce mám TÁBOR a v druhé PRAHA. Zkoušel jsem to zamezit podmínkou IS NULL, ale stejně vypisuje oba výsledky. Jde mi o to, pokud existuje v tabulce u uživatele záznam o doručovací adrese, tak upřednostnit toto město. Pokud není, tak vyhledá z tabulky user. V případě, že je záznam o městě v tabulce dorucovaci_adresa, tak zobazí jen z města z tabulky dorucovaci_adresa a tabulku user bude ignorovat. Snad jsem to popsal srozumitelně a je tam jen drobná chybička. Děkuji předem za rady

SELECT 
        ob.id_user,us.jmeno,us.mesto,us.nick,us.mail,us.posledni_pristup,us.lokace,us.pass 
      FROM 
        objednavky ob 
      left JOIN 
        dorucovaci_adresa do 
          ON ob.id_user = do.id_user AND LOWER(do.A_mesto) LIKE '%".$v."%' 
      left JOIN user us 
          ON ob.id_user = us.id AND LOWER(us.mesto) LIKE '%".$v."%' AND do.id_user IS NULL
      WHERE $or
      GROUP BY us.mail
Kajman
Profil
Nevypisujete žádný sloupec z dorucovaci_adresa, jinak to na první pohled vypadá korektně. Někdy pomůže zazávorkovat joiny, ale to asi nebude tento případ...
FROM 
       ( objednavky ob 
      left JOIN 
        dorucovaci_adresa do 
          ON ob.id_user = do.id_user AND LOWER(do.A_mesto) LIKE '%".$v."%' 
          )
      left JOIN user us 
          ON ob.id_user = us.id AND LOWER(us.mesto) LIKE '%".$v."%' AND do.id_user IS NULL

Zkuste nachystat vzorová data (obsah tabulek a dotaz s vyplněnými proměnnými $v a $or) s ukázkou problému např. na sqlfiddle.
freeTel
Profil *
Děkuji, hned jak přijdu z práce, tak se na to podívám a případně to dám jako ukázku
freeTel
Profil *
Tohle se chová úplně stejně jako bez závorek. sqlfiddle.com/#!9/c5a6c6/3


Omlouvám se, jsem musel db přepsat kv§li stejnému městu ať to je autentické. sqlfiddle.com/#!9/395bc0/2


Předchozí dotaz je na Semily a pod tímto odkazem chci výsledky z Teplic. sqlfiddle.com/#!9/395bc0/3
Kajman
Profil
Moc nechápu, co Vám nefunguje. Oba dotazy mně přijdou v pořádku.

Jen nevypisujete žádné sloupce z tabulky dorucovaci_adresa, tak jsou u Semil samé null hodnoty ze tabulky uživatelů (protože se našla adresa v doručovací adrese a tedy se nemá připojit žádný řádek z uživatelů).
freeTel
Profil *
Nemá vypsat uživatele pod tímto id (1001207). Protože ten má doručovací adresu Semily


Má se vypsat pod městem Teplice Jiří Žák protože ten nemá jinou dorucovaci_adresu. Jan Hus tam nemá co dělat protože má jinou doručovací adresu: Semily
Kajman
Profil
freeTel:
Nemá vypsat uživatele pod tímto id (1001207). Protože ten má doručovací adresu Semily

Ale z tabulky user tam nejsou žádná data navíc. To id 1001207 vypisujete z objednavky, na ni žádná omezení nejsou. Jen to pak zprzníte nesmyslným group by, které by nešlo, pokud by byl server nastaven, aby nesmyslné group by nepovolil.


Má se vypsat pod městem Teplice Jiří Žák protože ten nemá jinou dorucovaci_adresu. Jan Hus tam nemá co dělat protože má jinou doručovací adresu: Semily
Ale nemá doručovací adresu, ve které je město Teplice. Tohle přeci máte v podmínce.


Moc si nejsem jistý, co chcete, ale možná toto.

sqlfiddle.com/#!9/395bc0/17

Edit: možná si dodejte distinct (nebo group by)
SELECT DISTINCT us.mail
FROM   user us
       LEFT JOIN dorucovaci_adresa do
              ON us.id = do.id_user
WHERE  Coalesce(Lower(do.a_mesto), Lower(us.mesto)) LIKE '%Semily%'
       AND us.id IN (SELECT ob.id_user
                     FROM   objednavky ob)
freeTel
Profil *
Chtěl jsem to vyzkoušet, ale nevypsalo mi to nic.
      $sqli = $mysqli->query("
      SELECT 
        ob.id_user,us.jmeno,us.mesto,us.nick,us.mail,us.posledni_pristup,us.lokace,us.pass 

FROM   user us
       LEFT JOIN dorucovaci_adresa do
              ON us.id = do.id_user
WHERE  Coalesce(Lower(do.a_mesto), Lower(us.mesto)) LIKE '%".$v."%'
       AND us.id IN (SELECT ob.id_user
                     FROM   objednavky ob); LIMIT $start,$zobrazit");



Už jsem to rozdýchal. To je přesně ono. Moc děkuji za čas, trpělivost a důvtip

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