[PHP] query selecteert uit kolom en zelfde kolom filteren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een kolom waar ik alles uit selecteer en nog wat zaken controleer.

("SELECT uitleg FROM plannen WHERE id= ".$plan['plan_id']." AND beschikbaar = 0");

OK, dit is een werkbare query, werkt dus ook.

Ik wil een scheiding maken tussen 2 woorden die voorkomen in "uitleg"

Dus stel er staan in de kolom uitleg verschillende woorden welke altijd beginnen met ITEM1- of ITEM2- dan wil ik hier op kunnen selecteren.

Op een of andere manier heb ik het idee dat het moeilijk is 2 keer te selecteren uit dezelfde kolom en kom daar dus niet uit.

Stel ik zou alleen regels met ITEM1- willen selecteren dan denk ik aan iets als het volgende:

(Het is mij duidelijk dat ik trouwen LIKE zal moeten gebruiken met een wildcard %)


("SELECT uitleg FROM plannen WHERE id= ".$plan['plan_id']." AND uitleg LIKE 'ITEM1-%' AND beschikbaar = 0");

Uiteraard werkt dit niet, anders zou ik de vraag ook niet stellen. ;) Ik heb tevens ook het idee dat ik niet goed om ga met de aanhalingstekens.

Ben ik goed op weg of gaat het lastig worden om 2x op dezelfde kolom te selecteren waar je eerst alles selecteert en dan weer gaat selecteren op wat je geselecteerd hebt ?

Acties:
  • 0 Henk 'm!

  • Redshark
  • Registratie: Mei 2002
  • Laatst online: 20-09 13:25
SQL:
1
2
3
4
5
6
select 
uitleg 
from plannen 
where id = id and 
uitleg like 'ITEM-1%' 
or uitleg like 'item-2%'


Misschien is het handiger om een type-kolom oid toe te voegen denk ik, makkelijker, sneller en vast ook handiger voor wanneer er meerdere items bij komen die niet met 'item3-' beginnen oid.

SQL:
1
2
3
4
5
select uitleg 
from plannen 
where 
id = id  and type=1 or 
type=2

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zie al waar ik de mist in ga, dank je trouwens.

Het gaat mis bij de 2e AND achter de wildcard, dat moet ik even op zien te lossen.

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Ten eerste, je LIKE statement geeft waarschijnlijk niet het juiste resultaat omdat in de vorm waarin je hem nu hebt staan alleen rijen voldoen waarbij uitleg begint met ITEM1-

Ten tweede, selecteren binnen je selectie doe je door condities te combineren. Als een je uit alle rijen die voldoen aan conditie A de rijen wilt selecteren die voldoen aan B kun je net zo goed de rijen opvragen die voldoen aan A AND B.

Tot slot een noot over (mijn vermoeden van) je algehele werkwijze. Het lijkt erop dat je verschillende kenmerken van "plannen" in een enkele cel in je database aan het proppen bent. Zoals je nu zelf ondervindt maakt dat het selecteren op enkele kenmerken van "plannen" nodeloos complex. In een relationele database kun je dan meestal beter een extra tabel maken waarin je de kenmerken opslaat met een koppeling naar de rij in "plannen". Voro het ophalen van de gewenste rijen kun je gebruik maken van het JOIN statement.

[ Voor 0% gewijzigd door T-MOB op 02-07-2007 21:52 . Reden: in UBB is [b] nog niet deprecated... ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • sky-
  • Registratie: November 2005
  • Niet online

sky-

qn nna 👌

offtopic:
En ik hoop ook niet dat je zomaar $plan['plan_id'] uit de query string gebruikt ? url.php?plan_id=125121 etc.. dan kan je zo even je db leegwippen namelijk ;-)

don't be afraid of machines, be afraid of the people who build and train them.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja, je hebt wel gelijk, die database behoeft enige optimalisatie, maar op dit moment probeer ik het even zo en ben toch van plan de boel te herschrijven.

Nee gebruik het niet in een URL ;)

edit:


beschikbaar moet wel op 0 staan natuurlijk, anders gaat het niet :9

[ Voor 30% gewijzigd door Verwijderd op 02-07-2007 22:00 ]


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Ik zou zelf geen like gebruiken, maar een left. Dus where left(uitleg, 6) = 'ITEM-1' Een like moet je pas gebruiken als de selectie elke keer te veel gaat verschillen. Weet je elke keer de prefix, gebruik dan de left functie wat dat geeft een betere performance.

De query van RedShark zou dan als volgt worden:
code:
1
select uitleg from plannen where ( id=$planid ) and ( left(uitleg, 6) in ('ITEM-1', 'ITEM-2') )


Als je in 1 query zowel een 'and' en een 'or' krijgt, gebruik dan altijd haakjes om de juiste intepretatie af te dwingen. Neem de where clausule: id=2 and uitleg='a' or uitleg='b'.

Wij weten dat uitleg 'a' of 'b' EN id de waarde twee moet hebben. Echter de database kan hem ook lezen als selecteer alle records waarbij plan=2 en uitleg='a' OF alleen uitleg='b'. De database zou dus ook een record met id=3 kunnen teruggeven. Gebruik je een clausule als where (id=2) and (uitleg='a' or uitleg='b') dan is er maar 1 intepretatie mogelijk.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Niemand_Anders schreef op dinsdag 03 juli 2007 @ 10:46:
Ik zou zelf geen like gebruiken, maar een left. Dus where left(uitleg, 6) = 'ITEM-1' Een like moet je pas gebruiken als de selectie elke keer te veel gaat verschillen. Weet je elke keer de prefix, gebruik dan de left functie wat dat geeft een betere performance.
Bron? LIKE queries zijn met name eng als ze met een wildcard beginnen, omdat je dan geen index goed kan gebruiken. Maar waarom zou left hier sneller zijn?
Wij weten dat uitleg 'a' of 'b' EN id de waarde twee moet hebben. Echter de database kan hem ook lezen als selecteer alle records waarbij plan=2 en uitleg='a' OF alleen uitleg='b'. De database zou dus ook een record met id=3 kunnen teruggeven. Gebruik je een clausule als where (id=2) and (uitleg='a' or uitleg='b') dan is er maar 1 intepretatie mogelijk.
Keyword hier is operator precedence, de volgorde staat dus vast. Neemt niet weg dat ik het met het advies haakjes gebruiken eens ben, het leest makkelijker en niet iedereen weet de precedence van de operators.

{signature}


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Bron? LIKE queries zijn met name eng als ze met een wildcard beginnen, omdat je dan geen index goed kan gebruiken. Maar waarom zou left hier sneller zijn?
Een soortgelijke topic is een paar maanden geleden ook op een MySQL irc channel behandeld. MySQL zet een like welke begint met een vaste prefix om naar een left vergelijking. Bij een like kan namelijk nooit de index worden gebruikt. Bij een left wel. Dit omzetten gebeurt automatisch (iig in MySQL).

Neem een telefoonboek: je kunt heel erg eenvoudig alle namen opzoeken die beginnen met 'Sm'. Echter het is een stuk lastiger om de namen te vinden die eindigen op 'it'. MySQL heeft in elk geval de mogelijkheid om een left via de index uit te voeren. Daarnaast kan de Left in combinatie met het IN keyword worden gebruikt waar dat niet kan met een like.
Keyword hier is operator precedence
Inderdaad en daar gaat het ook fout, want AND komt voor OR. Ofwel er is een where ID=2 and uitleg='a' en een where uitleg='b' (zonder id koppeling). Je hebt dus de haakjes nodig om te controlen of uitleg van record met id=2 de waarde 'a' of 'b' heeft. Echter de TS begint net met databases, dus heb ik geprobeert zo veel mogelijk 'normale' taal te gebruiken..

If it isn't broken, fix it until it is..

Pagina: 1