Autor Zpráva
Radicz
Profil *
Zdravim všechny a prosím o pomoc. Mam dotaz kterým sosam data z více tabulek naráz. Mám tabulku bodů, každý z nich má své ID. Podle tohoto ID najdu všechny řádky v tabulce mapa_zarazeni_ip, které náleží danému bodu. Tabulka mapa_zarazeni_ip pouze spojuje tabulku bodu a tabulku IP adres. Díky tomuto dokážu vysosat třeba 5 IP adres které náleží danému bodu. Jde ale teď o to že mam ještě jednu tabulku mapa_ip_stav, kde jednotlivé ip adresy z tabulky mají svůj stav který je buďto jedna nebo nula. Dotaz je umí vysosat i tyto stavy, ALE bohužel díky distinct vynechá všechny schodné tudíž mi vždy vypíše maximálně jednu jedničku a jednu nulu. ale já potřebuju aby vypsal tolik stavů kolik mam IP adres k jednotlivému bodu. Po odstranění distinct vlivem četných průchodů mam zas řadu čísel, který nedávaj smysl. Děkuji za jakoukoliv odpověd.

¨    $pokus = mysql_query
     ("
      SELECT 
        mapa_bod.nazev AS nazev, 
        mapa_bod.adresa AS adresa,
        mapa_bod.gps_x AS gps_x,
        mapa_bod.gps_y AS gps_y,
        mapa_bod.vsesmer AS vsesmer,
        mapa_pasmo.pasmo AS pasmo,
        mapa_polarizace.polarizace AS polarizace,
        mapa_sifrovani.sifrovani AS sifrovani,
        mapa_foto.slozka AS slozka,
        GROUP_CONCAT(distinct mapa_ip.ssid) AS ssid,
        GROUP_CONCAT(distinct mapa_ip.ip) AS ip,
        GROUP_CONCAT(distinct mapa_ip.smer) AS smer,
        GROUP_CONCAT(distinct mapa_ip_stav.stav) AS stav,
        GROUP_CONCAT(distinct mapa_foto.link) AS foto        
      FROM mapa_bod
        LEFT JOIN mapa_pasmo ON mapa_bod.pasmo = mapa_pasmo.id_pasmo
        LEFT JOIN mapa_polarizace ON mapa_bod.polarizace = mapa_polarizace.id_polarizace
        LEFT JOIN mapa_sifrovani ON mapa_bod.sifrovani = mapa_sifrovani.id_sifrovani
        LEFT JOIN mapa_zarazeni_ip ON mapa_bod.id_bod = mapa_zarazeni_ip.id_bod
        LEFT JOIN mapa_ip ON mapa_zarazeni_ip.prirazeni = mapa_ip.id_ip
        LEFT JOIN mapa_ip_stav ON mapa_zarazeni_ip.prirazeni = mapa_ip_stav.id_ip 
        LEFT JOIN mapa_zarazeni_foto ON mapa_bod.id_bod = mapa_zarazeni_foto.id_bod
        LEFT JOIN mapa_foto ON mapa_zarazeni_foto.prirazeni = mapa_foto.id_foto
      WHERE mapa_bod.zobraz = 1
      GROUP BY mapa_bod.id
    ");

     while($pole = mysql_fetch_assoc($pokus))
     {
        print_r($pole);
     }


Výpis s distinct (všimněte si položky stav vybraná jsou 3 IP ale pouze dva stavy):
Array
(
    [nazev] => Na Kohoutě 12
    [adresa] => Na Kohoutě 12, Ústí nad Labem
    [gps_x] => 50.686816584573770
    [gps_y] => 14.000144004821777
    [vsesmer] => 1300
    [pasmo] => 5 GHz
    [polarizace] => horizontální
    [sifrovani] => WPA2+PSK type CCMP(AES)
    [slozka] => kohout_12/
    [ssid] => pokus,vseborice.net_ksk-5G,vseborice.net_1-5G
    [ip] => 172.16.2.255,172.16.45.1,172.16.34.1
    [smer] => Ústí Nad Labem,Skorotice,vsesmer
    [stav] => 1,0
    [foto] => 06.jpg,04.jpg,02.jpg,07.jpg,05.jpg,03.jpg,01.jpg
)



Výpis bez distinct (vybrány jsou 3 IP adresy ale hromada nepoužitelných stavů)
Array
(
    [nazev] => Na Kohoutě 12
    [adresa] => Na Kohoutě 12, Ústí nad Labem
    [gps_x] => 50.686816584573770
    [gps_y] => 14.000144004821777
    [vsesmer] => 1300
    [pasmo] => 5 GHz
    [polarizace] => horizontální
    [sifrovani] => WPA2+PSK type CCMP(AES)
    [slozka] => kohout_12/
    [ssid] => pokus,vseborice.net_1-5G,vseborice.net_ksk-5G
    [ip] => 172.16.2.255,172.16.34.1,172.16.45.1
    [smer] => Ústí Nad Labem,vsesmer,Skorotice
    [stav] => 1,1,1,0,1,1,0,0,1,1,0,0,1,1,0,1,1,1,1,0,1
    [foto] => 02.jpg,07.jpg,05.jpg,03.jpg,01.jpg,06.jpg,04.jpg
)

Radicz
Profil *
Nikdo nic? To snad ne, to je snad poprvé co jsem nedostal odpověd :(
Kajman_
Profil *
A jakém formátu vlastně chcete ty stavy dostat?
Radicz
Profil *
V řadě za sebou odděléné čárkou, stejně tak jako je ip s tim že první stav odpovídá prvnímu ip druhý stav odpovídá druhýmu ip atd. Trošku sem nad tim uvažoval a nevim jestli je to klíčové, ale očividně to mrší ten výběr fotek, protože řadá stavů je pak vynásobená tim počten fotek. Ted by se měli zobrazit 3 stavy, ale je jich 21, protože je vybráno 7 fotek. Když odeberu výběr fotek, vše funguje jak má.
PostCC
Profil
Radicz:
Nemělo by tam být ještě určeno v jakém pořadí mají ty stavy následovat a explicitně i oddělovač? Tedy něco jako:

...
     GROUP_CONCAT(DISTINCT mapa_ip.smer) AS smer,
     GROUP_CONCAT(DISTINCT mapa_ip_stav.stav ORDER BY mapa_ip_stav.Id SEPARATOR ',') AS stav,
     GROUP_CONCAT(DISTINCT mapa_foto.link) AS foto


Tak bych to tedy zkusil. Jinak není zaručeno v jakém pořadí si MySQL výsledky sgrupuje.
Koneckonců je dobrým zvykem uvádět tyto dvě direktivy v každém použití funkce GROUP_CONCAT.
Radicz
Profil *
PostCC:
Děkuji za poučení, bohužel problém se tim nevyřešil.
Kajman_
Profil *
Možná si zkuste zgroupovat ip a fotky zvlášť, takhle to jejich spojení každného s každým nedává zrovna smysl. Snad něco jako
select tmp.*,
       mapa_foto.slozka AS slozka,
       GROUP_CONCAT(mapa_foto.link) AS foto
from   (SELECT mapa_bod.nazev AS nazev,
               mapa_bod.adresa AS adresa,
               mapa_bod.gps_x AS gps_x,
               mapa_bod.gps_y AS gps_y,
               mapa_bod.vsesmer AS vsesmer,
               mapa_pasmo.pasmo AS pasmo,
               mapa_polarizace.polarizace AS polarizace,
               mapa_sifrovani.sifrovani AS sifrovani,
               GROUP_CONCAT(mapa_ip.ssid ORDER BY mapa_ip.id_ip) AS ssid,
               GROUP_CONCAT(mapa_ip.ip ORDER BY mapa_ip.id_ip) AS ip,
               GROUP_CONCAT(mapa_ip.smer ORDER BY mapa_ip.id_ip) AS smer,
               GROUP_CONCAT(mapa_ip_stav.stav ORDER BY mapa_ip.id_ip) AS stav,
               mapa_bod.id_bod
        FROM   mapa_bod
        LEFT   JOIN mapa_pasmo
        ON     mapa_bod.pasmo = mapa_pasmo.id_pasmo
        LEFT   JOIN mapa_polarizace
        ON     mapa_bod.polarizace = mapa_polarizace.id_polarizace
        LEFT   JOIN mapa_sifrovani
        ON     mapa_bod.sifrovani = mapa_sifrovani.id_sifrovani
        LEFT   JOIN mapa_zarazeni_ip
        ON     mapa_bod.id_bod = mapa_zarazeni_ip.id_bod
        LEFT   JOIN mapa_ip
        ON     mapa_zarazeni_ip.prirazeni = mapa_ip.id_ip
        LEFT   JOIN mapa_ip_stav
        ON     mapa_zarazeni_ip.prirazeni = mapa_ip_stav.id_ip
        WHERE  mapa_bod.zobraz = 1
        GROUP  BY mapa_bod.id_bod) tmp
LEFT   JOIN mapa_zarazeni_foto
ON     tmp.id_bod = mapa_zarazeni_foto.id_bod
LEFT   JOIN mapa_foto
ON     mapa_zarazeni_foto.prirazeni = mapa_foto.id_foto
group  by tmp.id_bod, mapa_foto.slozka
Radicz
Profil *
Kajman, PostCC
Mockrát děkuji

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: