Ik ben bezig met een website waar een database (MySQL) met telefoons en abonnementen achter zit. De abonnementen zijn afkomstig van verschillende datafeeds, de tabel bevat nu rond de 30.000 abonnementen maar dat worden er makkelijk 100.000 als alle feeds in gebruik genomen zijn.
Een aparte tabel met telefoons bevat per telefoon verschillende informatie.
Nu wil ik een query maken die de 5 meest populaire telefoons selecteerd (een integer veld geeft de populariteit van de telefoon aan) en daarbij uit de abonnement tabel een abonnement koppelt aan de telefoon. Het betreft abonnementen + telefoon combinaties die in de abonnementen tabel staan.
Telefoon tabel
phone_id (int, auto_incr)
populariteit enum(1,2,3,4,5)
merk (varchar)
model (varchar)
En nog meer velden die niet van toepassing zijn op mijn vraag
Abonnement tabel
sub_id (int auto_incr)
merk (varchar)
model(varchar)
en meer velden die niet van toepassing zijn.
Nu is het probleem dat niet iedere telefoon ook een abonnement heeft dus moet er eerst gekeken worden of de betreffende telefoon wel of niet een abonnement heeft. Ik heb de volgende query (ik haal nu niet alle velden op die ik normaal gesproken zou willen ophalen) die natuurlijk niet goed werkt, maar ik zou niet weten hoe ik het probleem oplos:
Dit werkt niet natuurlijk omdat er voor iedere telefoon (totaal 1450 telefoon) gekeken moet worden of er een abonnement is. Er moet dus 1450 x 30.000 gekeken worden naar een match met deze query. Dat is alles behalve efficiënt, ik weet dat er een oplossing moet zijn maar het is me niet gelukt deze te vinden. Is er iemand die een antwoord heeft? Kan me voorstellen dat mijn verhaal enigzins onduidelijk is, als er verheldering nodig is hoor ik het graag.
Ik zelf had het idee dat ik per telefoon kijk of er een abonnement is en als er 5 combinaties zijn gevonden stopt de query. De telefoons moeten nog steeds op populariteit zijn gesorteerd.
Een aparte tabel met telefoons bevat per telefoon verschillende informatie.
Nu wil ik een query maken die de 5 meest populaire telefoons selecteerd (een integer veld geeft de populariteit van de telefoon aan) en daarbij uit de abonnement tabel een abonnement koppelt aan de telefoon. Het betreft abonnementen + telefoon combinaties die in de abonnementen tabel staan.
Telefoon tabel
phone_id (int, auto_incr)
populariteit enum(1,2,3,4,5)
merk (varchar)
model (varchar)
En nog meer velden die niet van toepassing zijn op mijn vraag
Abonnement tabel
sub_id (int auto_incr)
merk (varchar)
model(varchar)
en meer velden die niet van toepassing zijn.
Nu is het probleem dat niet iedere telefoon ook een abonnement heeft dus moet er eerst gekeken worden of de betreffende telefoon wel of niet een abonnement heeft. Ik heb de volgende query (ik haal nu niet alle velden op die ik normaal gesproken zou willen ophalen) die natuurlijk niet goed werkt, maar ik zou niet weten hoe ik het probleem oplos:
code:
1
2
3
4
5
6
| SELECT phones.merk, phones.model, sub.sub_id FROM phones INNER JOIN abonnementen as sub ON (phones.merk = sub.merk AND phones.model = sub.model) ORDER by phones.populariteit DESC LIMIT 5 |
Dit werkt niet natuurlijk omdat er voor iedere telefoon (totaal 1450 telefoon) gekeken moet worden of er een abonnement is. Er moet dus 1450 x 30.000 gekeken worden naar een match met deze query. Dat is alles behalve efficiënt, ik weet dat er een oplossing moet zijn maar het is me niet gelukt deze te vinden. Is er iemand die een antwoord heeft? Kan me voorstellen dat mijn verhaal enigzins onduidelijk is, als er verheldering nodig is hoor ik het graag.
Ik zelf had het idee dat ik per telefoon kijk of er een abonnement is en als er 5 combinaties zijn gevonden stopt de query. De telefoons moeten nog steeds op populariteit zijn gesorteerd.