Toon posts:

[doctrine][mysql] filteren, probleem met between

Pagina: 1
Acties:

Onderwerpen


  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 21-05 18:08
Ik heb een probleem bij het terugkrijgen van de juiste data.

Schema:
rent_item
title
description
etc..

rent_item_option
option_type_id (bv. kmstand of provincie)
option_id (bv. groningen)
rent_item_id
value (bv. de waarde van de kmstand: 150000)

Nu bouw ik de query op in doctrine en kom ik op de volgende code (echte code genereerd onderstaande DQL query):

PHP:
1
2
3
4
5
6
7
8
9
$q = Doctrine_Query::create()
->select('r.*, ro.*')
->from('RentItem r')
->leftJoin('r.RentItemOption ro')
->where('ro.option_id IN (15,16,18)')
->andWhere('ro.option_id = 9')
->andWhere('(ro.option_type_id = 1 AND ro.value BETWEEN 0 AND 200000)')
->andWhere('(ro.option_type_id = 2 AND ro.value BETWEEN 2001 AND 2010)')
->groupBy('r.id');


dit resulteert in de volgende mysql query:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT m.id AS m__id, m.user_id AS m__user_id, m.type AS m__type, m.title AS m__title, m.description AS m__description, m.defaultprice AS m__defaultprice, m.phonenumber AS m__phonenumber, m.faxnumber AS m__faxnumber, m.mobilenumber AS m__mobilenumber, m.website AS m__website, m.longitude AS m__longitude, m.latitude AS m__latitude, m.created_at AS m__created_at, m.updated_at AS m__updated_at, m.slug AS m__slug, m2.id AS m2__id, m2.option_type_id AS m2__option_type_id, m2.option_id AS m2__option_id, m2.rent_item_id AS m2__rent_item_id, m2.value AS m2__value
FROM mo_rent_item m
LEFT JOIN mo_rent_item_option m2 ON m.id = m2.rent_item_id
WHERE (
m2.option_id = 9
AND
m2.option_id
IN ( 15, 16, 19 )
AND (
m2.option_type_id =1
AND m2.value
BETWEEN 0
AND 200000
)

AND (
m2.option_type_id =2
AND m2.value
BETWEEN 2001
AND 2010
)
)
GROUP BY m.id


Deze geeft altijd 0 resultaten. Heeft te maken met de between die ook afhankelijk is van de option_type_id. Gebruik ik echter een OR voor de 'betweens' dan werkt het wel maar zijn de resultaten verkeerd.

Ik kan het oplossen in php zelf maar wil het liefst alles in 1 query, hoe bouw ik deze nou goed op?

  • Acid_Burn
  • Registratie: Augustus 2001
  • Laatst online: 25-05 15:43
Dat je 0 results krijgt is wel duidelijk.. r.option moet en (15, 16 of 18) zijn en 9 zijn .. en (1 of 2) met wat andere voorwaarden. Dat gaat natuurlijk niet gebeuren. Schrijf eerst eens op wat je precies wil hebben.

[Voor 23% gewijzigd door Acid_Burn op 06-07-2011 22:59]

Glass Eye Photography | Zelfbouw wireless fightstick | Mijn puzzel site


  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Dat moet inderdaad een OR zijn lijkt me, en gaat dat werken met die group by?

https://oneerlijkewoz.nl
I have these thoughts / so often I ought / to replace that slot / with what I once bought / 'cause somebody stole my car radio / and now I just sit in silence


  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 21-05 18:08
nee de and klopt 1 rentitem heeft ongeveer 20 regels in rent_item_option (opties dus). Ik vraag alle rent_items op die die voldoen aan de filter.

Dus bv. alle rent_items met als optie groningen of drenthe (dat is de IN) EN een optie diesel. Dat stukje werkt helemaal zelfs met de group by waar ik ook mijn twijfels over had, het gaat pas fout bij het stukje met de beween die ook moet voldoen aan de option_type_id die bepaald welke filter het is (de kmstand of jaartal).

  • Acid_Burn
  • Registratie: Augustus 2001
  • Laatst online: 25-05 15:43
Toch is het dit stukje wat er voor zorgt dat je 0 results krijgt. Die waarde kan gewoon nooit aan allebei de voorwaarden voldoen.
code:
1
2
->where('ro.option_id IN (15,16,18)')
->andWhere('ro.option_id = 9')

Glass Eye Photography | Zelfbouw wireless fightstick | Mijn puzzel site


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Per optie type zal je een join met de option tabel moeten doen.

{signature}


  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 22:52
Los daarvan groepeer je op 1 veld en selecteer je er veel meer, dat is ook niet helemaal juist :)

  • RobIII
  • Registratie: December 2001
  • Laatst online: 23:10

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Voutloos schreef op woensdag 06 juli 2011 @ 23:14:
Per optie type zal je een join met de option tabel moeten doen.
Juist; en ik zou de voorwaarden op de join zelf zetten daarvoor (dus join foobar on foo = bar and x = y).
Reinier schreef op woensdag 06 juli 2011 @ 23:15:
Los daarvan groepeer je op 1 veld en selecteer je er veel meer, dat is ook niet helemaal juist :)
Ook dat is juist: Hoe werkt dat GROUP BY nu eigenlijk?

[Voor 37% gewijzigd door RobIII op 06-07-2011 23:16]

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

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Overigens heb je natuurlijk ook gewoon last van een dramatisch datamodel. Waren kmstand, locatie of bouwjaar nog niet uitgevonden toen je begon met het opslaan van autodata?

{signature}


  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 21-05 18:08
RobIII schreef op woensdag 06 juli 2011 @ 23:16:
[...]

Juist; en ik zou de voorwaarden op de join zelf zetten daarvoor (dus join foobar on foo = bar and x = y).

[...]

Ook dat is juist: Hoe werkt dat GROUP BY nu eigenlijk?
Inderdaad, hier ga ik mee aan de gang!
Wat betreft group by zal ik ook aanpassen.
Voutloos schreef op woensdag 06 juli 2011 @ 23:20:
Overigens heb je natuurlijk ook gewoon last van een dramatisch datamodel. Waren kmstand, locatie of bouwjaar nog niet uitgevonden toen je begon met het opslaan van autodata?
Het gaat niet alleen om auto's, rentitems kunnen verschillende dingen zijn die bv. Geen kmstand hebben. De opties moeten van voor naar achter beheerbaar zijn. Locatie, volgorde, single of multiple waardes etc.

wat voor datamodel zouden jullie kiezen voor een filter?

[Voor 38% gewijzigd door rewind. op 07-07-2011 08:21]


  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 21-05 18:08
Ik heb het nu als volgt opgelost:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$q = Doctrine_Query::create()
->select('r.id, COUNT(r.id) AS numconditions')
->from('RentItem r')
->leftJoin('r.RentItemOption ro')
->where('ro.option_id IN (15,16,18)')
->orWhere('ro.option_id = 9')
->orWhere('(ro.option_type_id = 1 AND ro.value BETWEEN 0 AND 200000)')
->orWhere('(ro.option_type_id = 2 AND ro.value BETWEEN 2001 AND 2010)')
->groupBy('r.id');
->having('numconditions >= 4');
?>

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
rewind. schreef op donderdag 07 juli 2011 @ 08:16:
Het gaat niet alleen om auto's, rentitems kunnen verschillende dingen zijn die bv. Geen kmstand hebben. De opties moeten van voor naar achter beheerbaar zijn. Locatie, volgorde, single of multiple waardes etc.

wat voor datamodel zouden jullie kiezen voor een filter?
In dat geval kan je datamodel en de query die je post prima hoor. Als je er maar op let dat als alle items wel een eigenschap (waar de definitie van vast staat) gemeen hebben, dat je die gewoon wel in de item tabel op neemt.

{signature}


  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 21-05 18:08
uiteindelijk komt er nog een option_group boven die de option types groepeert zodat iedere rentitem zijn eigen groepje opties heeft die passen bij de rentitem.

  • Acid_Burn
  • Registratie: Augustus 2001
  • Laatst online: 25-05 15:43
Waarom maak je van dit
PHP:
1
2
->where('ro.option_id IN (15,16,18)')
->orWhere('ro.option_id = 9')


niet dit:
PHP:
1
->where('ro.option_id IN (9, 15,16,18)')

Glass Eye Photography | Zelfbouw wireless fightstick | Mijn puzzel site


  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 21-05 18:08
Acid_Burn schreef op zaterdag 09 juli 2011 @ 20:03:
Waarom maak je van dit
PHP:
1
2
->where('ro.option_id IN (15,16,18)')
->orWhere('ro.option_id = 9')


niet dit:
PHP:
1
->where('ro.option_id IN (9, 15,16,18)')
Goed punt, komt omdat de query nu automatisch wordt opgebouwt per option_type_id. Dit is natuurlijk gewoon samen te voegen dus zal ik aanpassen :)
Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee