Autor Zpráva
exec
Profil *
Ahoj, prosím vas o radu, mam tetno dotaz:

SELECT * FROM job
RIGHT JOIN kody ON kody.id_kod=job.id_kod
LEFT JOIN usr ON usr.id_usr=job.id_usr

Ten funguje jak chci. Ja bych ale potreboval k vyberu pridat tabulku kon. V ni je mimo jine i sloupec id_kod. Potreboval bych spojit tento id_kod se sloupcem id_kod v tabulce kody.
Dohromady vsechny tabulky maji asi 80 radku. Kdyz jsem se o select pokousel sam, tak se mi vypsalo nejakych 500 radku. Uz jsem z toho cely nestasny, cely vecer jsem se to pokousel rozchodit podle svojich predstav, ale porad se nejak nedari.
Proto vas prosim o radu jestli mi poradite.

Predem dekuji.
Kajman_
Profil *
SELECT * FROM kon
RIGHT JOIN kody ON kody.id_kod=kon.id_kod
LEFT JOIN job ON kody.id_kod=job.id_kod
LEFT JOIN usr ON usr.id_usr=job.id_usr
exec
Profil *
Presne toto jsem udelal a vypsalo se mi strasne moc radku, kolem 500. Nechapu proc to tak dela, kdyz soucet radku ve vsech tabulkach je asi 80.

Nevite prosim nekdo cim to muze byt? Potrebuju proste jenom k puvodnimu vypisu pridat tabulku kon a nahradit nebo vypsat vsechno kde se kon.id_kod=kody.id_kod

Predem dekuji.
Kajman_
Profil *
Naleznou se všechny možné kombinace řádků z jednotlivých tabulek dané podmínkou. Pokud máte více jobů k jenomu kódu, více uživatelů k jenomu jobu i více kon k jednomu kódu, tak se to ty kombinace tím násobením narůstají.
exec
Profil *
Ano, presne tak to mam. Pujde nejakym zpusobem zabranit kombinacim? Aby se vybralo pouze tech 80 radku.

Děkuji
Kcko
Profil
pouzit podminku WHERE napriklad ...
Kajman_
Profil *
exec
Když nechcete kombinace, tak ty tabulky nespojujte. Pokud kombinace chcete nějak rozumně seskupovat, tak použijte group by.
exec
Profil *
Ja proste jenom potrebuj k vyse uvedenu dotazu pridat radky a sloupce z tabulky kon, kde se id_kod musi rovnat id_kod v tabulce kody. Ja uz jsem z toho cely zblbly, muzete mi to prosim nekdo zkusit napsat?

diky za ochotu.
Kajman_
Profil *
Však to přidá. Ke každému řádku z původního selectu to dá 0 až N řádků z tabulky kon, které vyhovují podmínce rovnosti na id_kod.

Zkuste si
select id_kod, count(*) pocet from kon group by id_kod

ať víte kolik výskytů jednotlivé id_kod mají.
exec
Profil *
vratilo mi to id_kod=1 a pocet=33 to sedi a v pocital jsem i ten puvodni dotaz a ten ma 21 radku. Kdyz se to spoji tak by v celkovym selectu melo byt 54 radku. Group by je asi dobra cesta, ale nevim jak to pouzit.
Kajman_
Profil *
Kdyz se to spoji tak by v celkovym selectu melo byt 54 radku
Pokud je v původním dotaze 21 radku s id_kod=1, tak s přidanou tabulkou kon to bude 21*33.

Group by je asi dobra cesta, ale nevim jak to pouzit.
Težko říct, záleží co z těch různých 33 řádků pro jedno id_kon chcete.
exec
Profil *
Kajman_
no prave vypise se 21*33 kvuli tem kombinacim jak jste rikal.
Potreboval bych vybrat vsechny sloupce z te kon. Chcete je vypsat? pomuze Vam to k necemu?

Predem moc dekuju
Alphard
Profil
exec
vy musíte vědět, které řádky chcete a které ne
vytváří se kartézský součin, dotabáze vám neumí číst myšlenky, může přiřadit záznam s největším nebo nejmenším id, může vybrat náhodný, může skoro cokoliv, ale musíte to rozhdonot vy

Potreboval bych vybrat vsechny sloupce z te kon.
určitě sloupce? zatím řešíte záznamy, ale ty zase nechcete všechny...

Chcete je vypsat? pomuze Vam to k necemu?
asi to bude nejlepší, vypište co v tabulkách máte a co chcete, aby vám dotaz vrátil (nekopírujte sem stovky řádků, kdyžtak to omezte, stačí příklad)
exec
Profil *
OK, tak tedy ukazu priklad:
kody:
==============
id_kod | sleva_kod |
==============
1 | A1234
2 | B4321

job
====================
id_usr | id_kod | zaplaceno |
====================
1 | 2 | 0
3 | 1 | 1
2 | 1 | 0

usr
==================
id_usr | jmeno | prijmeni |
==================
1 | Frantisek | Novy
2 | Josef | Novak
3 | Karel | Kos

kon
===================
id_kod | firma | zaplaceno|
===================
2 | skoda auto | 1
1 | zetor | 0

Chci to spojit tak, aby vysledek vypadal takto:
========================================
jmeno    | prijmeni    | zaplaceno | sleva_kod | firma       |
========================================
Frantisek|Novy         | 0               |B4321        |NULL|
Karel      | Kos           |1                |A1234       |NULL|
Josef      | Novak       |0                |A1234       |NULL| 
NULL|NULL|1                |B4321       |skoda auto| 
NULL|NULL|0                |A1234       |zetor          | 


Doufam ze jsem to ted vypsal srozumitelne a je z vystupu jasne co potrebuji.

Predem opet děkuji
Kajman_
Profil *
Takže nehledáte vlastně join, ale union all dvou nezávislých selectů.
exec
Profil *
Kajman_
Asi nejspis ano, ja se v tom mysql moc nevyznam. Myslite ze byste dokazal a byl ochotny sestavit dotaz?

Dekuji
exec
Profil *
A jeste jsem zapomel v tom vypisu udelat to, ze kdyz neni kod nikde pouzity, musi se vypsat do sleva_kod a do ostatnich sloupcu NULL.
Kajman_
Profil *
Zkuste něco jako

select 'usr' zdroj, u.jmeno, u.prijmeni, j.zaplaceno, k.sleva_kod, null firma from kody k, job j, usr u where k.id_kod=j.id_kod and j.id_usr=u.id_usr
union all
select 'kon', null,null,f.zaplaceno, k.sleva_kod, f.firma from kody k, kon j where k.id_kod=j.id_kod
union all
select 'kody', null, null, null, k.sleva_kod, null from kody k where k.id_kod not in (select id_kod from kon union select id_kod from job)

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: