[MySQL] AND & OR samen ?

Pagina: 1
Acties:

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 24-04 13:47
Ik wil 3 WHERE voorwaarden in mijn SQL query maar ze moeten zowel AND als OR zijn, dus meerdere where mogen waar zijn, maar ook allemaal. Als er minimaal maar 1 waar is !

Misschien snap je al wat ik bedoel, misschien niet, dus ik zal mijn specifieke voorbeeld hieronder zetten.

Ik heb 3 tabellen; leden, berichten en fotos. Deze bevatten allemaal een kolom user_id en client_ip.
Verder zit zitten in de tabellen de informatie die verwacht van elke tabel.

Ik wil dit:
Van alle tabellen wil ik dat dezelfde client_ip nummers eruit gehaald worden, met als voorwaarde dat de user_id verschillend is.

De slimme gotter weet wat ik wil; kijken welke mensen mogelijk meerdere accounts hebben.
Ik zoek expres niet naar een gebruiker die verschillende client_ip's bij zijn berichten of foto's heeft want dat is nou eenmaal mogelijk.

Met AND & OR samen bedoel ik zo'n query:(deze query kan dus natuurlijk niet)
PHP:
1
2
3
4
5
6
7
8
SELECT leden.user_id, leden.client_ip, fotos.user_id, fotos.client_ip, berichten.user_id, berichten.client_ip
FROM leden, berichten, fotos
WHERE leden.user_id != fotos.user_id
AND leden.user_id != berichten.user_id
AND fotos.user_id != berichten.user_id
ANDOR leden.client_ip  = fotos.client_ip
ANDOR leden.client_ip = berichten.client_ip
ANDOR fotos.client_ip = berichten.client_ip

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
code:
1
2
3
4
5
6
7
8
9
10
11
12
<? 
SELECT leden.user_id, leden.client_ip, fotos.user_id, fotos.client_ip, berichten.user_id, berichten.client_ip 
FROM leden, berichten, fotos 
WHERE leden.user_id != fotos.user_id 
AND leden.user_id != berichten.user_id 
AND fotos.user_id != berichten.user_id 
AND (
  leden.client_ip  = fotos.client_ip 
  OR leden.client_ip = berichten.client_ip 
  OR fotos.client_ip = berichten.client_ip
)
?>

Of ben ik nou gek :?

Je wil A én B én C én (D of E of F), toch?

[ Voor 6% gewijzigd door RobIII op 20-04-2005 03:30 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 24-04 13:47
In dit stukje code hieronder is het dus ook mogelijk dat meerdere voorwaarden waar zijn. Dus niet OF, OF, OF máár: EN/OF, EN/OF, EN/OF ?
PHP:
1
2
3
4
5
AND (
  leden.client_ip = fotos.client_ip 
  OR leden.client_ip = berichten.client_ip 
  OR fotos.client_ip = berichten.client_ip
)


Ik zie ook nog iets aan mijn eigen code waar ik aan twijfel. Deze 3 voorwaarden:
PHP:
1
2
3
WHERE leden.user_id != fotos.user_id 
AND leden.user_id != berichten.user_id 
AND fotos.user_id != berichten.user_id

Moeten nu alle tabellen een rij hebben met een user_id om een resultaat terug te krijgen?

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

edit:

niet goed gelezen :o

[ Voor 95% gewijzigd door justmental op 20-04-2005 07:27 ]

Who is John Galt?


  • BM
  • Registratie: September 2001
  • Laatst online: 21:00

BM

Admin Softe Goederen
verytallman schreef op woensdag 20 april 2005 @ 03:46:
Moeten nu alle tabellen een rijveld hebben met een user_id om een resultaat terug te krijgen?
Hoe had je het anders voor je gezien?

Vergelijken met een veld wat in die tabel nieteens bestaat? :?
Lijkt me vrij logisch dat dat niet gaat, dus ja, al je tabellen moeten een veld hebben genaamd user_id

Xbox
Even the dark has a silver lining | Te koop: Chigee AIO-6 + toebehoren


  • CyeZ
  • Registratie: September 2001
  • Laatst online: 10-09-2025

CyeZ

Vroem vroem!!!

Volgens mij begrijp je 'OR' verkeerd. Een nederlandse 'of' is inderdaad A of B, maar niet A en B. De OR zoals gebruikt in SQL is echter (A, B of (A en B)). Wil je een OR hebben zoals het in de nederlandse taal werkt dan zou je XOR moeten gebruiken.

[18:54] <Prammenhanger> |HunterPro|eet
[18:55] <Prammenhanger> lijkt best op
[18:55] <Prammenhanger> |HunterProFeet


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 07-05 22:49

curry684

left part of the evil twins

CyeZ schreef op woensdag 20 april 2005 @ 08:42:
Volgens mij begrijp je 'OR' verkeerd. Een nederlandse 'of' is inderdaad A of B, maar niet A en B. De OR zoals gebruikt in SQL is echter (A, B of (A en B)). Wil je een OR hebben zoals het in de nederlandse taal werkt dan zou je XOR moeten gebruiken.
Da's standaard boolese algebra met dank aan de Engelse wiskundige George Boole, niet zozeer SQL :)

De waarheidstabel van OR, oftewel "true if one of the components is true":
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
AND, oftewel "true if all of the components are true":
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
XOR, oftewel: "true if an odd number of components is true":
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
Alle andere waarheidstabellen kun je afleiden door een NOT te gebruiken:
!0 = 1
!1 = 0
Topicstarter zoekt dus inderdaad heel expliciet gewoon de OR :)

[edit]
Interessant leesvoer trouwens voor de mensen die de achtergrond van Boolese algebra niet kennen: http://en.wikipedia.org/wiki/Boolean_algebra

[ Voor 15% gewijzigd door curry684 op 20-04-2005 10:25 ]

Professionele website nodig?


  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 24-04 13:47
OR is dus wat ik nodig heb, maar gek genoeg krijg ik nog steeds geen resultaten terug.

Ik heb nu:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT leden.user_id, leden.client_ip, fotos.user_id, fotos.client_ip, berichten.user_id, berichten.client_ip
FROM leden, fotos, berichten
WHERE (
    leden.user_id != fotos.user_id
    OR leden.user_id != berichten.user_id
    OR fotos.user_id != berichten.user_id
)
AND (
    fotos.client_ip = leden.client_ip
    OR berichten.client_ip = leden.client_ip
    OR fotos.client_ip = berichten.client_ip 
)

Ik krijg 0 resultaten terug, terwijl ik zeker meerdere dezelfde ip's in de tabel leden heb staan maar met een ander user_id.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 07-05 22:49

curry684

left part of the evil twins

Wat de neuk probeer je met die query te doen met een rits joins in OR's en not-equal-to? :X

Professionele website nodig?


  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 24-04 13:47
Ik wil dat het resultaat uit de query niet dezelfde user_id heeft (leden.user_id, fotos.user_id, berichten.user_id) en daarna zeg ik dat de client_ip's wel gelijk moeten zijn.

Uiteraard werkt het nog niet....anders zou ik hier niet posten.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Vertel eerst eens in duidelijke taal wat je wilt hebben. Dus niet in sql maar op een manier van "Alle foto's van users die een of meer berichten hebben achter gelaten".

Maar dan dus wat jij wilt. Als je dat eerst eens duidelijk doet dan is het veel makkelijker om een query te schrijven en kunnen wij je er mischien ook mee helpen. Op deze manier komen we denk niet zover.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • b19a
  • Registratie: September 2002
  • Niet online
Als ik je SP goed gelezen heb dan wil je dus het volgende:
SQL:
1
2
3
4
5
SELECT leden.user_id, leden.client_ip, fotos.user_id, fotos.client_ip, berichten.user_id, berichten.client_ip
FROM leden, fotos, berichten
WHERE (leden.user_id != fotos.user_id AND fotos.client_ip = leden.client_ip)
   OR (leden.user_id != berichten.user_id AND berichten.client_ip = leden.client_ip)
   OR (fotos.user_id != berichten.user_id AND fotos.client_ip = berichten.client_ip)

IP moet gelijk zijn maar de ID's niet, en dan voor alle 3 de tabellen.

[ Voor 4% gewijzigd door b19a op 20-04-2005 18:34 ]


  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 24-04 13:47
Ok ik zal het nog duidelijker proberen dan in mijn beginpost.

Ik heb 3 tabellen, leden/fotos/berichten, waarin informatie staat die je verwacht. Dus in berichten staan de kolommen: id, user_id, id_ontvanger, client_ip, onderwerp, en bericht. Zo staan in elke tabel de kolommen user_id en client_ip.
Nu wil ik weten wie er mogelijk meerdere accounts hebben door te kijken welke ip's hetzelfde zijn. MAAR, een user kan verschillende ip's hebben omdat hij een dynamisch ip heeft.
Ik wil dus kijken welke ip's in alle 3 de tabellen overeenkomen, maar dan moet het user_id wel verschillen.
Dus een resultaat zou kunnen zijn: leden.user_id 5 en 31 hebben allebei het ip 123.123.123.123
Of: leden.user_id 8 en berichten.user_id 20 hebben allebei het ip 123.123.123.123

  • lordsnow
  • Registratie: Maart 2000
  • Laatst online: 19:06

lordsnow

I know nothing

Oftewel, je wilt uit meerdere tabellen (alle) IP adressen halen, en dan de user_id's die daar aan gekoppeld zijn vergelijken om te zien of deze wel of niet hetzelfde zijn.

[ Voor 7% gewijzigd door lordsnow op 20-04-2005 18:49 ]


  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 24-04 13:47
lordsnow schreef op woensdag 20 april 2005 @ 18:49:
Oftewel, je wilt uit meerdere tabellen (alle) IP adressen halen, en dan de user_id's die daar aan gekoppeld zijn vergelijken om te zien of deze wel of niet hetzelfde zijn.
Dat is wat ik bedoel. Maar ook moet gekeken worden of er in een tabel zelf meerdere dezelfde ip's voorkomen die niet hetzelfde user_id hebben.

Deze oplossing:
PHP:
1
2
3
4
5
SELECT leden.user_id, leden.client_ip, fotos.user_id, fotos.client_ip, berichten.user_id, berichten.client_ip
FROM leden, fotos, berichten
WHERE (leden.user_id != fotos.user_id AND fotos.client_ip = leden.client_ip)
   OR (leden.user_id != berichten.user_id AND berichten.client_ip = leden.client_ip)
   OR (fotos.user_id != berichten.user_id AND fotos.client_ip = berichten.client_ip)

Geeft 500 resultaten, dat klopt gewoon niet. Ik heb heel misschien een paar.
(Ik heb 30 leden namelijk....)

Ik heb wel meerdere accounts (verschillende user_id's) met dezelfde client_ip in de tabel leden.
Met die worden met de bovenstaande code er toch niet uitgehaald? Moet deze code er niet bij gezet worden?
PHP:
1
2
3
OR (leden.user_id != leden.user_id AND leden.client_ip = leden.client_ip)
OR (berichten.user_id != berichten.user_id AND berichten.client_ip= berichten.client_ip)
OR (fotos.user_id != fotos.user_id AND fotos.client_ip= fotos.client_ip)

Maar dit is nog even optioneel want de code bovenaan deze post klopt ook nog niet.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

verytallman schreef op woensdag 20 april 2005 @ 22:05:
Deze oplossing:
PHP:
1
2
3
4
5
SELECT leden.user_id, leden.client_ip, fotos.user_id, fotos.client_ip, berichten.user_id, berichten.client_ip
FROM leden, fotos, berichten
WHERE (leden.user_id != fotos.user_id AND fotos.client_ip = leden.client_ip)
   OR (leden.user_id != berichten.user_id AND berichten.client_ip = leden.client_ip)
   OR (fotos.user_id != berichten.user_id AND fotos.client_ip = berichten.client_ip)

Geeft 500 resultaten, dat klopt gewoon niet. Ik heb heel misschien een paar.
(Ik heb 30 leden namelijk....)
Dat kan wel eens kloppen, want die join is niet in orde. Je joint niet op alledrie de tabellen tegelijk, en daar gaat het mis. Misschien kun je in dit geval meer met een UNION dan een JOIN?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • _Sunnyboy_
  • Registratie: Januari 2003
  • Laatst online: 14-01 22:23

_Sunnyboy_

Mooooooooooooooooo!

Klinkt heel erg als een subquery of een UNION ja.

Welke versie van MySQL heb je daar, want de nog veelgebruikte versie 3.x ondersteund geen UNION of subqueries.

Maar goed ik zal het toch even proberen.

Als ik het goed begrijp wil je de userid voor alle users waarvoor geld dat hun ip door meerdere users wordt gebruikt. Waarom haal je al die andere data dan ook op? Dan krijg je gegarandeert te veel regels.

Onderstaande query haalt op:

alle userid's op waarvoor geld dat de client_ip in leden en fotos gelijk zijn en de userid ongelijk
+
alle userid's op waarvoor geld dat de client_ip in leden en berichten gelijk zijn en de userid ongelijk
+
alle userid's op waarvoor geld dat de client_ip in fotos en berichten gelijk zijn en de userid ongelijk

Dit resultaat wordt vervolgens met de buitenste query op duplicaten gefiltert (DISTINCT)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT DISTINCT x.userid 
FROM (
  SELECT l.userid
  FROM leden AS l
  LEFT JOIN fotos AS f ON l.client_ip = f.client_ip
  WHERE f.userid != l.userid
UNION
  SELECT l.userid
  FROM leden AS l
  LEFT JOIN berichten AS b ON l.client_ip = b.client_ip
  WHERE b.userid != l.userid
UNION
  SELECT f.userid
  FROM fotos AS f
  LEFT JOIN berichten AS b ON f.client_ip = b.client_ip
  WHERE b.userid != f.userid
) AS x


Dit zou het volgens mij moeten doen, maar ik gebruik hier wel UNION en subqueries. Als je version 3.x van MySQL hebt kan je misschien de 3 queries die ik doe uitvoeren en in de array inladen en vervolgens de duplicaten uit de array filteren (ik weet niet in welke taal je bezig bent)

Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Waarom heb je hier een subquery gebruikt dan? :o Je kan die toch ook weglaten? De geselecteerde kolommen heten hetzelfde, dus komen die als het goed is in één resultset terecht. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
waarom doe je niet zoiets.
SQL:
1
2
3
4
5
6
7
8
select count( distinct l.UserID ) as Aantal, l.user_ip
from leden l
Join Berichten b
on l.user_ip = b.user_ip
Join Fotos f
on l.user_ip = f.user_ip
group by user_ip
order by Aantal desc


Overal waar aantal dan groter is dan 1 zijn er meerder users per ip adres. en dus mischien mensen die meerdere accounts hebben.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 07-05 22:49

curry684

left part of the evil twins

Doe sowieso ajb jezelf een plezier en schrijf alle joins uit ipv op deprecated syntax te vertrouwen, de ANSI notatie is tig keer helderder... dus niet deprecated:
code:
1
2
3
select * from tabel1, tabel2 
where tabel1.foreign = tabel2.primary 
  and filter = true;

maar netjes volgens ANSI:
code:
1
2
3
select * from tabel1
join tabel2 on tabel1.foreign = tabel2.primary
where filter = true;

Dat maakt je query echt een stuk helderder om het onderscheid te maken tussen je joins en je filters :)

Professionele website nodig?


  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 24-04 13:47
Ik ga het proberen met array's....
Hoe precies weet ik nog niet maar ik ga gewoon lekker een array maken en daar bewerkingen op uitvoeren.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
verytallman schreef op donderdag 21 april 2005 @ 22:02:
Ik ga het proberen met array's....
Hoe precies weet ik nog niet maar ik ga gewoon lekker een array maken en daar bewerkingen op uitvoeren.
Hoezo?? Volgens mij wil je gewoon alle users hebben die met verschillende user id's ingelogd zijn vanaf hetzelfde user_ip. Dit is makkelijk met sql op te lossen. Als je gebruik maakt van de query die ik eerder gaf en deze eventueel als subquery gebruikt.

Je kan natuurlijk ook zelf gaan klooien maar ik zie daar tot nu toe nog geen reden voor.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1