[MySQL] Operator != wil niet werken

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • T-RonX
  • Registratie: Augustus 2004
  • Laatst online: 25-06 23:45
Ik heb een probleem met een mysql query.
De query is als volgt:

SQL:
1
2
3
4
5
6
7
8
9
10
(
   SELECT DISTINCT i.*
   FROM string_inhoud i,
   (SELECT str_id FROM string_inhoud WHERE taal='en' AND subtaal='us') AS t
   WHERE i.taal='en' AND i.subtaal='en' AND i.str_id!=t.str_id
)
UNION
(
   SELECT DISTINCT * FROM string_inhoud WHERE taal='en' AND subtaal='us'
)


Mijn tabel ziet er zo uit:
idstr_idtaalsubtaalstring
2welkom_textenentest1
9testenentest2
1welkom_titelenentest3
3welkom_titelenustest4
8testenustest5


Nu zou deze query 3 regels terug moeten geven waarbij de regels met taal 'en' en subtaal 'en' er uit gelaten worden waar ook een str_id van is met 'en' en 'us' (id 1 en 9).

Dit stuk in de sql query lijkt gewoon genegeerd te worden "i.str_id!=t.str_id" want de query geeft gewoon alle rijden terug.

Heeft iemand een idee waarom dit zo zou kunnen zijn?

Acties:
  • 0 Henk 'm!

  • giMoz
  • Registratie: Augustus 2002
  • Laatst online: 25-09 21:17

giMoz

iets met meester...

heb je "<> " al eens geprobeerd?

Of niet natuurlijk...


Acties:
  • 0 Henk 'm!

  • Motrax
  • Registratie: Februari 2004
  • Niet online

Motrax

Profileert

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(
SELECT DISTINCT i.*
    FROM string_inhoud i,
        (SELECT str_id 
        FROM string_inhoud 
        WHERE taal = 'en'
        AND subtaal = 'us'
        ) AS t
    WHERE i.taal = 'en'
    AND i.subtaal = 'en'
    AND i.str_id != t.str_id
)

UNION

(
SELECT DISTINCT *
FROM string_inhoud
WHERE taal = 'en'
AND subtaal = 'us'
);
Ik heb een hekel aan brakke formatting

☻/
/▌
/ \ Analyseert | Modelleert | Valideert | Solliciteert | Generaliseert | Procrastineert | Epibreert |


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 20:36

Haan

dotnetter

giMoz schreef op woensdag 03 december 2008 @ 13:04:
heb je "<> " al eens geprobeerd?
Of 'Is Not' ?

!= is sowieso fout ik zie dat het om MySql gaat, misschien dat het daar wel zou kunnen, ik ging even uit van MS SQL

[ Voor 23% gewijzigd door Haan op 03-12-2008 13:26 ]

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 20:41

.oisyn

Moderator Devschuur®

Demotivational Speaker

T-RonX schreef op woensdag 03 december 2008 @ 13:03:
Heeft iemand een idee waarom dit zo zou kunnen zijn?
Ja, je doet een cross join waarmee je dus alle rijen van de ene tabel combineert met alle rijen van de andere tabel (met als resultaat N×M rijen). Doe maar eens gewoon een SELECT * (ook in de subquery) en je snapt waarom. Je bent waarschijnlijk op zoek naar iets als NOT EXISTS / NOT IN

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • T-RonX
  • Registratie: Augustus 2004
  • Laatst online: 25-06 23:45
Sorry voor het formatten en de kleurtjes(lukte niet). Ik heb eigenlijk zo een beetje alle relevante operators geprobeert, IS NOT, <>, ! etc... Maar daar lijkt het niet aan te liggen. Als ik een operator als '=' gebruik dan pakt hij de waardes wel, en doet hij wat hij moet doen. Alleen de andere kant op wil niet.

Acties:
  • 0 Henk 'm!

  • RiCkY82
  • Registratie: Oktober 2001
  • Laatst online: 25-09 20:48
Volgens mij zou het zoiets moeten wezen bij de eerste query :)

SQL:
1
2
3
4
5
SELECT DISTINCT i.*
FROM string_inhoud i
WHERE i.taal='en' 
AND i.subtaal='en' 
AND i.str_id NOT IN (SELECT str_id FROM string_inhoud WHERE taal='en' AND subtaal='us')


Deze subquery
SQL:
1
SELECT str_id FROM string_inhoud WHERE taal='en' AND subtaal='us'

kan namelijk meedere resultaten opleveren. Vandaar dat je het zo op moet lossen. Met een != kom je er dan niet, aangezien dit maar voor 1 resultaat zou gelden

Resultaat, getest en werkend (Zonet getest op eigen systeem en geeft 2, 3 en 8 terug. Zoals verwacht..):
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT DISTINCT i. *
FROM string_inhoud i
WHERE i.taal = 'en'
AND i.subtaal = 'en'
AND i.str_id NOT
IN (
  SELECT str_id
  FROM string_inhoud
  WHERE taal = 'en'
  AND subtaal = 'us'
)
UNION
SELECT DISTINCT *
FROM string_inhoud
WHERE taal = 'en'
AND subtaal = 'us'
.

[ Voor 108% gewijzigd door RiCkY82 op 03-12-2008 14:15 . Reden: getest en werkend bevonden op eigen systeem ]


Acties:
  • 0 Henk 'm!

  • Big Womly
  • Registratie: Oktober 2007
  • Laatst online: 01-09 13:39

Big Womly

Live forever, or die trying

RiCkY82 schreef op woensdag 03 december 2008 @ 13:50:
SQL:
1
2
3
4
5
SELECT DISTINCT i.*
FROM string_inhoud i
WHERE i.taal='en' 
AND i.subtaal='en' 
AND i.str_id NOT IN (SELECT str_id FROM string_inhoud WHERE taal='en' AND subtaal='us')

SQL:
1
SELECT str_id FROM string_inhoud WHERE taal='en' AND subtaal='us'
Zo lijkt het mij ook. Deze 2 queries gecombineerd met een union.

Hoewel je eerder huidige query meer deze kant op ging
SQL:
1
2
3
4
5
6
7
8
9
10
select *
from ( select *
       from string_inhoud
       where taal = 'en' and subtaal = 'en'
     ) en,
     ( select *
       from string_inhoud
       where taal = 'en' and subtaal = 'us'
     ) us
where en.str_id = us.str_id(+)

[ Voor 25% gewijzigd door Big Womly op 03-12-2008 14:09 ]

When you talk to God it's called prayer, but when God talks to you it's called schizophrenia


Acties:
  • 0 Henk 'm!

  • T-RonX
  • Registratie: Augustus 2004
  • Laatst online: 25-06 23:45
Heel erg bedankt RiCkY82 en de rest, zo werkt het inderdaad. NOT IN was nieuw voor mij, dus weer wat geleerd. :)

Thx!
Pagina: 1