Üdv!
A következő a problémám így hajnalba.
Van egy tábla melyben a csoportok vannak felsorolva.
Úgymint csop_id;csopnev
A másik táblába vannak az userek.
Csináltam két subselectet.
Az egyikből lehet dobálni a másikba a csoportokat.
A cél subselect értékét implode-val tárolom az user táblába.
Azaz pl.: user.csoport= '3','4'
Viszont a két subselet kiírásánál ugye jó lenne látni mely csoportba van, és mely csoportok amelybe még nincs az user.
És itt nem megy a select.
A következő lekérdezést próbáltam
SELECT * FROM ugyfelcsoportok WHERE csop_id NOT IN (SELECT csoport FROM user WHERE user_id='$j2') ORDER BY csopnev
és a
SELECT * FROM ugyfelcsoportok WHERE csop_id IN (SELECT csoport FROM user WHERE user_id='$j2') ORDER BY csopnev
De nem megy. Hol van a hiba?
pch
- 2676 megtekintés
Hozzászólások
Ez a "user.csoport= '3','4'" - ez hogyan szeretne működni?
Egészen pontosan a "select csoport from user ...", az azt fogja visszaadni, hogy '3','4'.
A select * from csoport where id in ... pedig azt az EGY csoportot fogja visszaadni, aminek az id-ja: '3','4' - ilyen gondolom nincs.
Rendes ember csinál egy user táblát, egy csoport táblát, meg egy user-csoport összerendelő táblát. Az összesen három darab tábla.
- A hozzászóláshoz be kell jelentkezni
Elvileg az IN megnézné hogy a felsorolásban benne van-e az id nem?
Azaz ha a csop_id=4 akkor a 3,4 be benne van.
pch
u.i.: de lehet külön tábla lesz, mert közbe rájöttem, hogy későbbi feldolgozásnál se jó ez az adatszerkezet.
--
http://www.buster.hu "A" számlázó
--
- A hozzászóláshoz be kell jelentkezni
1. Nem. Az 'IN' a select eredményét kapja, egy sor - egy elem. Mivel a select egy sort ad vissza, az az 'IN' számára egy elem - azzal nézi az egyezést. Egy mező az egyik táblában - egy mező a másik táblában. Nincs felbontás, nincs darabolás, semmi sincsen.
2. Ez az adatszerkezet semmire sem jó, ha sql-en belül szeretnél vele kezdeni bármit. Ha csak az alkalmazás írja és olvassa, akkor azt raksz bele, amit akarsz, de sql-en belül nem használható semmire se.
3. Rendes indexet sem tudnál csinálni egy ilyen oszlopra, mert mit indexelne be az '3','4' stringen?
Amúgy ott bukik a gondolatod, hogy nem a megfelelő escape-eléssel írtad fel az állapotot.
Ezt használod az insertnél valójában:
INSERT: '\'3\', \'4\''
a
SELECT ... csoport IN (SELECT ...)
pedig ezzel lesz ekvivalens:
SELECT .... csoport IN ('\'3\', \'4\'');
nem pedig ezzel:
SELECT .... csoport IN ('3', '4');
- A hozzászóláshoz be kell jelentkezni
> Elvileg az IN megnézné hogy a felsorolásban benne van-e az id nem?
Inkább azt, hogy a subselect által visszaadott rekordok között ott van-e.
- A hozzászóláshoz be kell jelentkezni
Ez egyebkent is borzaszto lassu lesz, mert dependent subquery, a mysql optimizer egyik leghiresebb gyengesege. En a helyedben atirnam joinra.
- A hozzászóláshoz be kell jelentkezni
Már átírtam. Külön táblába tárolom, mely csoportokba van benne az user.
Mert később egy másik táblába úgy is fel akarom még használni ez a megoldás meg alkalmatlan rá.
pch
--
http://www.buster.hu "A" számlázó
--
- A hozzászóláshoz be kell jelentkezni
Akkor abból kell dolgozni
table user (uid, name, ...)
table group (gid, name, ...)
table groupmember (uid, gid, ...)
és akkor amiben benne van:
select group.gid, group.name
from group
inner join (
select gid
from groupmember
inner join user on user.uid=groupmember.uid and user.name='pistike'
) as x
on x.gid=group.gid
amiben nincs benne:
select group.gid, group.name
from group
left join (
select gid
from groupmember
inner join user on user.uid=groupmember.uid and user.name='pistike'
) as x
on x.gid=group.gid
where x.gid is null
- A hozzászóláshoz be kell jelentkezni
Szervusztok !
ha jól értelmezem az alapproblémát, akkor olyan a lekérdezés, hogy azokat a usereket keressük, akik _jelen esetben pl_ a 3. csoportban benne vannak, de a 4.-ben nincsenek benne.
Erre a megoldási javaslatom (a la Google)
(a WHERE-hez akármi egyéb szűrést lehet beírni)
===============================================================================
table user ( U_uid, name, ...)
table group ( G_gid, name, ...)
table groupmember (uid, gid, ...)
SELECT uid, gid
FROM groupmember
RIGHT JOIN user ON U_uid=uid
WHERE
GROUP BY uid
HAVING SUM(IF (gid='3', 1, 0) > 0 AND SUM ( IF(gid='4',1,0) = 0
ORDER BY U_uid;
CSZ
- A hozzászóláshoz be kell jelentkezni
hja, klonozza temptable-be, minel nagyobb annal szopobb...
- A hozzászóláshoz be kell jelentkezni
Hali!
Az elképzelésben szerintem egy hiba van. Méghozzá hogy a not in azt csinálja amire gondolsz. Szerintem te a except -et keresed. Vagy oralceül minus.
- A hozzászóláshoz be kell jelentkezni