Autor Zpráva
Gogo_v
Profil
Dobrý den. Asi před třemi měsíci jsem řešíl problém se složeným selectem kde jsem dostal skvělou radu od mistra SQL Kajmana Odmazání záznamu z DB podle podmínek ve složeném selectu
select n.*
from   nic n
join   (select KL.id
        from   klient KL
        inner  join nic NIC
        on     KL.id = NIC.Klientid
        where  NIC.ipv4_addr_3 between 211 and 220
        group  by KL.id) t
on     t.id = n.Klientid
where  n.ipv4_addr_3 not between 211 and 220
Situace je stejná, nyní ale potřebuju vyselektovat záznamy, kde klient nemá IP v rozsahu 211 - 220 snažil jsem se zmodifikovat tento select, ale asi jsem uplně nepochopil jak výše uvedený select pracuje :(


 Ukazka dat
+------+----+-------------+-------------+
| nid  | id | ipv4_addr_3 | ipv4_addr_4 |
+------+----+-------------+-------------+
| 2153 | 17 |          41 |          14 |
| 2154 | 17 |          41 |          15 |
| 6977 | 17 |         216 |         191 |
| 2149 | 19 |          41 |          10 |
| 6918 | 19 |         216 |         134 |
| 5944 | 22 |         200 |         230 |
| 7720 | 22 |         220 |         117 |
|   28 | 26 |         129 |          73 |
|   29 | 27 |         129 |          72 |
| 2395 | 26 |         130 |          62 |
|   34 | 31 |         129 |         131 |
+------+----+-------------+-------------+
Select by měl vrátit ID 28, 29, 2395, 34

Děkuji moc za pomoc.
Kajman
Profil
Něco takového?
select KL.id
from   klient KL
left   join nic NIC
on     KL.id = NIC.Klientid
       and NIC.ipv4_addr_3 between 211 and 220
where  NIC.Klientid is null
Gogo_v
Profil
Kajman:
No myslim že to zjednodušším

+------+-------------+-------------+----------+
| id   | ipv4_addr_3 | ipv4_addr_4 | Klientid |
+------+-------------+-------------+----------+
| 6000 |          18 |         205 |     4689 |
| 6004 |          18 |         206 |     4689 |
| 6005 |         134 |          83 |     4168 |
| 6008 |         214 |          86 |     4168 |
| 6009 |         134 |          87 |     4341 |
| 6011 |         220 |          89 |     4699 |
| 6012 |         136 |          12 |     4699 |
| 6013 |         128 |         173 |     4701 |
todle je jedna tabulka a potřebuju s toho dotazem dostat výsledek : Vypiš všechny záznamy pokud u Klientid není záznam v ipv4_addr_3 mezi 211 a 220. takže pokud je u Klientid v tom sloupci číslo mezi 211 a 220 tak všechny ostatni záznamy se stejným Klient id ignoruje. Výsledek by měl být z příkladu id 6000,6004,6009,6013

Mockrát děkuju.
Kajman
Profil
select * from nic n where n.Klientid not in (select s.Klientid from nic s where s.ipv4_addr_3 between 211 and 220)

Když by byl pomalý s podivným explainem, tak raději přepsat na join.
Gogo_v
Profil
Kajman:
Diky moc, nakonec jsem to nějak zplácal, v podstatě tak jak jste mi teď poradil. Šlo mi primarně pochopit princip jak vyřadit z nějakého dotazu část vracených výsledků. Asi jsem to konečně pochopil Diky :)
Pro zajímavost co mi z toho vylezlo :)

select N.*,CONCAT(N.ipv4_addr_1, '.', N.ipv4_addr_2, '.', N.ipv4_addr_3, '.', N.ipv4_addr_4) as ipv4,KO.jmeno,KO.prijmeni from nic N left join kontakt KO on KO.Klientid = N.Klientid  where N.port_id in (SELECT id AS port_id FROM porty WHERE zarizeni_id in (SELECT id from zarizeni where mgmt_rozsah=1)) AND N.Klientid not in (select Klientid from nic where ipv4_addr_3 between 211 AND 220)

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: