Toon posts:

Problemen met WHERE en OR-statements.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Alles werkt op zich. Het is een script geschreven om de database adhv een formulier te doorzoeken. Het gaat om een lijst van universiteiten met ratings erbij, zowel van gebruikers als uit de bladen.

WHERE (title LIKE %titles% AND Uni.rating = rating AND cijfer BETWEEN cijfer1 AND cijfer2) OR (title LIKE %title4% AND cijfer BETWEEN cijfer3 AND cijfer4) OR (title LIKE %title3% AND Uni.rating = rating2) OR (title LIKE %title2%)

De regel werkt op zich. Je kan nu op naam zoeken, op cijfer en op de rating (als je de laatste OR-statement eruit laat). Maar als je per onderdeel een invoer doet, werkt het niet goed. Is er misschien een manier waarop je mysql de OR statements kunt sorteren.

Eerst de eerste proberen, dan de tweede, de derde, etc.

Ik ben hier al enige tijd mee bezig. Het is eigenlijk ook de eerste keer dat ik me op deze manier verdiep in mysql en heb al veel moeten doen om die regel die hierboven staat aan de praat te krijgen. Ik zou elke hulp bijzonder waarderen.

Maarten

PS.
Ik gebruik dreamweaver, en die heeft moeite met het gebruiken van dezelfde namen voor dezelfde categorien in deze WHERE-regel, vandaar dat er cijfers zijn toegevoegd achter sommige codes. cijfer 1 = cijfer 3, cijfer 2 = cijfer 4, title = title1, title2, title3, rating = rating2.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 01-12 19:51

Robtimus

me Robtimus no like you

Hoezo sorteren? Je krijgt gewoon alle records die aan 1 van de OR statements voldoen. Dan maakt het niet meer uit welke.
Je kan natuurlijk wel de OR volgorde omdraaien, omdat dat efficienter kan zijn: veel talen, en wss ook databases, controleren maar zoveel als nodig. Dus als de eerste OR true oplevert hoeft de tweede niet meer gecontroleerd te worden.

Als je eerst alle resultaten wilt die aan de eerste OR voldoen, dan die van de tweede etc, dan kun je misschien UNION proberen:
SQL:
1
2
3
4
5
6
7
8
9
10
11
SELECT * FROM table
WHERE title LIKE %titles% AND Uni.rating = rating AND cijfer BETWEEN cijfer1 AND cijfer2
UNION
SELECT * FROM table
WHERE title LIKE %title4% AND cijfer BETWEEN cijfer3 AND cijfer4
UNION
SELECT * FROM table
WHERE title LIKE %title3% AND Uni.rating = rating2
UNION
SELECT * FROM table
WHERE title LIKE %title2%

Door UNION te gebruiken en niet UNION all krijg je geen dubbele records. Ik weet alleen niet of de volgorde zo wordt behouden of niet.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
SQL:
1
Where (Title like %titles%) or (Uni.rating = rating) or (cijfer between cijfer1 and cijfer2)

:?
edit:

Vraag waarschijnlijk verkeerd begrepen
IceManX schreef op vrijdag 30 maart 2007 @ 21:53:
veel talen, en wss ook databases, controleren maar zoveel als nodig. Dus als de eerste OR true oplevert hoeft de tweede niet meer gecontroleerd te worden.
Short-circuiting / minimal evaluation ;)

[ Voor 67% gewijzigd door RobIII op 30-03-2007 21:56 ]

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


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 01-12 19:51

Robtimus

me Robtimus no like you

Juist. Enorm van fan ook.
Ter vergelijking:

Java:
1
2
3
if (object != null && object.someMethod()) {
    // doe dingen, werkt perfect
}
Visual Basic:
1
2
3
4
5
if Not Object Is Nothing Then
    If Object.SomeMethod Then
        ' doe dingen; binnenste If is nodig want And doet dus niet aan short circuiting
    End If
End If

Overigens kennen veel talen die short circuiting kennen ook de niet-short circuit versie, bij Java en C(++) zijn dat & en | (tegenover && en || die wel short circuiten). Dat geeft de programmeur de keuze welke van de twee te gebruiken.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Rickets
  • Registratie: Augustus 2001
  • Niet online

Rickets

Finger and a shift

IceManX schreef op vrijdag 30 maart 2007 @ 22:31:
Visual Basic:
1
2
3
4
5
if Not Object Is Nothing Then
    If Object.SomeMethod Then
        ' doe dingen; binnenste If is nodig want And doet dus niet aan short circuiting
    End If
End If
Dit kan ook met VB.NET tegenwoordig.

Visual Basic:
1
2
3
if Not Object Is Nothing AndAlso Object.SomeMethod Then
   ' doe dingen, werkt ook perfect 
End If

If some cunt can fuck something up, that cunt will pick the worst possible time to fucking fuck it up, because that cunt’s a cunt.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Rickets schreef op vrijdag 30 maart 2007 @ 22:44:
[...]

Dit kan ook met VB.NET tegenwoordig.

Visual Basic:
1
2
3
if Not Object Is Nothing AndAlso Object.SomeMethod Then
   ' doe dingen, werkt ook perfect 
End If
Inderdaad de AndAlso en OrElse :X
Beetje ranzige constructie, but hey... it gets teh job done :P

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


Verwijderd

Topicstarter
bedankt voor de reacties! Ik zal er mee aan de slag gaan. Ik laat jullie weten wat het geworden is.

Verwijderd

Topicstarter
IceManX hartstikke bedankt voor de hulp! Ik had nog niet eerder gehoord van UNION, maar dat heeft wel zn effect gehad. Ik moest er nog een paar regels bij schrijven om ook de cijfers tegen elkaar af te laten wegen, en dat werkt nu.

Ik ging er in de eerste plaats ook van uit dat de server de OR-regels wel een voor een zou proberen, maar dat doet hij dus niet uit zichzelf.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 01-12 19:51

Robtimus

me Robtimus no like you

Jawel hoor. Voor elk record apart welteverstaan ;)

More than meets the eye
There is no I in TEAM... but there is ME
system specs

Pagina: 1