mysql not in subselect

Ü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

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.

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');

Ez egyebkent is borzaszto lassu lesz, mert dependent subquery, a mysql optimizer egyik leghiresebb gyengesege. En a helyedben atirnam joinra.

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

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

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.