[PHP/mySQL] Landen selectie incl. regio's

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Hey.

In de database heb ik feeds staan van verschillende landen met bijbehorende regio's. Na een zoekopdracht wil ik binnen de resultaten de landen laten zien met bijbehorende regio's (dus alleen de landen en regio's die gevonden zijn binnen de zoekresultaten).

Nu heb ik onderstaande query om de landen uit de zoekresultaten te halen, maar nu lukt het mij niet om in deze query ook de regio's, behorende bij de verschillende landen uit de database te halen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
SELECT 
    country_of_destination,
    COUNT(country_of_destination) AS countries,
    SELECT region_of_destination AS regios FROM lastminute_zomer WHERE country_of_destination = countries // Deze regel moet de regio's uit de database halen, maar dat werkt dus niet
FROM 
    lastminute_zomer
LEFT JOIN
    lastminute_aanbieders
ON
    lastminute_aanbieders.id = lastminute_zomer.aanbieder
GROUP BY country_of_destination


Wat ik dus wil is een lijstje zoals hieronder:

Spanje (12)
- Costa Brava (7)
- Costa del Sol (5)
Frankrijk (32)
- Bordeaux (22)

Etc.

Kan iemand mij in de goede richting duwen?

[ Voor 7% gewijzigd door radem205 op 07-01-2010 16:37 ]


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 00:12
Je denkt de verkeerde kant op. Je kunt beter tellen (en groeperen) per regio in je query. Als je daar ook het land bij ophaalt kun je in je applicatie de optelsom per land maken

In idee dus zoiets:
code:
1
2
3
4
5
6
7
8
SELECT
  count(*) AS amount,
  country,
  region
FROM
  lastminute_zomer
LEFT JOIN ...
GROUP BY region, country

[ Voor 3% gewijzigd door T-MOB op 07-01-2010 16:46 ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
T-MOB schreef op donderdag 07 januari 2010 @ 16:46:
Je denkt de verkeerde kant op. Je kunt beter tellen (en groeperen) per regio in je query. Als je daar ook het land bij ophaalt kun je in je applicatie de optelsom per land maken

In idee dus zoiets:
code:
1
2
3
4
5
6
7
8
SELECT
  count(*) AS amount,
  country,
  region
FROM
  lastminute_zomer
LEFT JOIN ...
GROUP BY region, country
Hartelijk dank, dit is inderdaad de oplossing. In de while loop controleer ik of het land al geechoot is, waardoor ik niet bij elke regio het betreffende land weergegeven wordt.

Thanks!

Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Nog even terugkomend op dit topic:

Mensen kunnen vakanties zoeken die in een bepaalde periode liggen. Nu kan het zijn dat één vakantie meerdere vertrekdata heeft binnen deze vooraf aangegeven periode. Nu wil ik dus deze vertrekdata ook tonen bij de zoekresultaten. Echter kom ik er niet uit hoe ik dit kan doen.

Wat ik nu heb:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT 
    *,
    DATE_FORMAT(departure_date, '%d-%m-%Y') AS departure_date, 
    DATE_FORMAT(departure_date, '%w') AS departure_day,
    vakantie_aanbieders.naam AS aanbiedernaam 
FROM 
    vakantie
LEFT JOIN
    vakantie_aanbieders
ON
    vakantie_aanbieders.id = vakantie_zomer.aanbieder
WHERE 
    departure_date BETWEEN '".convertdate($datumvan)."' AND '".convertdate(datumtot)."'
GROUP BY


Nu moet ik hoogstwaarschijnlijk een GROUP BY toepassen op de titel van de vakantie om zo dubbele records te verwijderen uit de zoekresultaten, maar hoe krijg ik in bovenstaande query ook, indien aanwezig, meerdere data ("datums" om misverstanden te voorkomen) er uit die ik dan kan weergeven bij de verschillende vakanties?

(Op dezelfde manier als in dit topic eerder aangegeven lijkt mij in dit geval niet de oplossing, aangezien je veel records kan krijgen)

Alvast bedankt voor je reactie!

[ Voor 3% gewijzigd door radem205 op 13-01-2010 16:34 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

'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.


Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Dank voor de link. Misschien ben ik erg dom, maar ik zie nog een oplossing om de data (datums) te kunnen tonen in de while loop. Je kan met meerdere GROUP BY elementen alleen maar count(), avg(), min(), max() gebruiken wat betekent dat er alleen getallen uit komen toch? (sorry voor de noob vraag misschien)

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
radem205 schreef op woensdag 13 januari 2010 @ 16:44:
Je kan met meerdere GROUP BY elementen alleen maar count(), avg(), min(), max() gebruiken wat betekent dat er alleen getallen uit komen toch? (sorry voor de noob vraag misschien)
Het ligt er een beetje aan welke aggregate functions er beschikbaar zijn in je RDBMS. In MySql zijn er in ieder geval nog andere dan dat jij aangeeft ;)

[ Voor 12% gewijzigd door Woy op 13-01-2010 16:51 ]

“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.”


Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Ik zie het ja (http://dev.mysql.com/doc/...n/group-by-functions.html), echter word ik er serieus niet wijs uit. Al deze Aggregate functies retourneren bij mijn weten een getal toch? Maar hoe kan ik dit dan gebruiken om ook de data (datums) uit te poepen bij elke vakantie :)?
Want ik heb toch niets aan een count(), etc.?

Moet ik het soms gaan zoeken in een inner select of iets dergelijks?

[ Voor 16% gewijzigd door radem205 op 13-01-2010 16:56 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dan moet je toch nog eens de link die NMe aanhaalt goed doorlezen. Een GROUP BY zorgt er voor dat je data aggregeert ( Samenvoegt ). De query zal dus van alle datum's die samengevoegd worden, iets moeten maken. Daarbij kan je denken aan MAX/MIN ( waar logischerwijs de Maximale/Minimale datum uit de groep word terug gegeven ).

Als je alle datums van de groep wil hebben, dan ben je niet goed bezig met GROUP BY

“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.”


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Feitelijk zou je GROUP_CONCAT kunnen gebruiken, maar dat returnt een string, geen lijst met datums.

De makkelijkste manier is overigens gewoon de hele lijst op te halen en te groeperen in je code. Ik hoopte dat je dat zelf zou begrijpen als je zou weten wat GROUP BY nu eigenlijk hoort te doen, maar dat lijkt niet helemaal overgekomen te zijn. ;)

'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.


Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Wat jullie zeggen over GROUP BY snap(te) ik (al). Alleen was mijn vraag meer of er een andere manier bestaat dan al eerder in dit topic is aangehaald om data te groeperen en weer te geven binnen elk vakantie item.

Want ik vind het zelf erg onlogisch klinken om eerst alle data uit de mysql te halen met de datums (voor het gemak) binnen de aangegeven periode en dan in php te gaan controleren wanneer een nieuwe vakantie item begint. Ik had gehoopt dat dit anders op te lossen was, maar helaas...

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

De andere optie is eerst een query doen voor alle vakanties, en vervolgens één per vakantie voor alle vertrekdata. Maar daarmee doe je al snel nogal een hoop queries op je database en dat vertraagt alleen maar onnodig. :)

'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.


Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Het zijn allemaal niet echt lekkere oplossingen. Ik moet ook gebruik maken van LIMIT om per pagina een x aantal items te tonen en wanneer ik alles orden op vertrekdata en titel dan krijg je per vakantie item meerdere records en loopt de LIMIT ook in de soep :(. Ik ga er nog maar eens een nachtje over slapen of dit wel is wat ik wil of dat ik het maar gewoon laat voor wat het is.

Misschien is dat GROUP_CONCAT nog niet zo gek... Exploden en weergeven.

[ Voor 8% gewijzigd door radem205 op 13-01-2010 17:25 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Waarom zou je groeperen op de naam als je verschillende datums wil weergeven per naam?

Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Ik heb het nu denk ik redelijk opgelost middels onderstaande query (misschien niet netjes maar het werkt wel:

code:
1
SELECT *, GROUP_CONCAT(DISTINCT(DATE_FORMAT(vertrekdatum, '%d-%m-%Y'))) AS vertrekdata FROM vakanties GROUP BY title LIMIT 0,30


Vertrekdata exploden en middels een for loop uitlezen.

Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
En wat doet dat * daar in je query? Als ik het goed heb, zorgt MySQL nu nog steeds voor een fout resultaat. Heb je MySQL (of alleen jouw connectie) al geconfigureerd? zolang dat niet is gebeurd, zijn al je resultaten onbetrouwbaar.

http://wiki.phpfreakz.nl/Werken_met_MySQL#Configuratie
Pagina: 1