Het vinden van de eerste in behandeling zijnde gebeurtenissen van de SQL-tabel

Ik heb een tabel met tv-gidsgegevens.

In een vereenvoudigde vorm zien de kolommen er als volgt uit ...

_id, title, start_time, end_time, channel_id

Wat ik probeer te doen is een lijst met tv-programma's maken in een NU/NEXT-indeling. Het genereren van de 'NOW'-lijst (wat er momenteel wordt uitgezonden) is eenvoudig, maar als ik een lijst probeer te krijgen van wat' NEXT 'laat zien, krijg ik problemen.

Ik heb dit geprobeerd ...

SELECT * from TV_GUIDE where start_time >= datetime('now') GROUP BY channel_id

Ja hoor, dit geeft me één tv-programma voor elke tv kanaal_id , maar het geeft me de laatste shows (op datum/tijd) in de tabel TV_GUIDE .

SQL is niet mijn sterke punt en ik heb moeite om uit te zoeken waarom alleen de laatste tv-shows worden geretourneerd. Het lijkt erop dat ik een subquery van een query (of een query van een subquery) moet uitvoeren. Ik heb combinaties van ORDER BY en LIMIT geprobeerd, maar ze helpen niet.

0
U moet geen kolommen selecteren die niet in de group by-clausule voorkomen, tenzij ze in geaggregeerde functies zijn. Vermijd ook SELECT * .
toegevoegd de auteur Mark Byers, de bron

2 antwoord

Ik geloof dat je eerst de stellen (channel_id,) van TV_GUIDE moet selecteren op basis van je criteria. Vervolgens geeft u de records van TV_GUIDE weer die voldoen aan die criteria:

SELECT source.* from TV_GUIDE AS source
JOIN (SELECT channel_id, MIN(start_time) AS start_time
    FROM TV_GUIDE
    WHERE start_time >=  now() GROUP BY channel_id ) AS start_times
ON (source.channel_id = start_times.channel_id 
    AND source.start_time = start_times.start_time)
ORDER BY channel_id;

Dit selecteert eerst alle shows met een minimale starttijd, één voor elk kanaal, waardoor u de kanaal-ID en de starttijd krijgt. Dan vult de andere informatie in (MySQL laat je soms die van een enkele query ophalen, maar ik heb het gevoel dat het een slechte gewoonte is om - misschien voeg je een veld toe en het zal niet meer werken) van een JOIN met dezelfde tabel.

Misschien wilt u een index toevoegen aan de gecombineerde velden (start_tijd, kanaal_id). Voor de zekerheid, maak er een UNIEKE index van.

1
toegevoegd
+1 Ik denk dat uw antwoord misschien juist is, maar ik moet controleren of alle gegevens correct zijn geretourneerd. Het is nu laat hier, dus ik zal het later proberen, maar eerst testen laten zien dat het werkt. Erg bedankt.
toegevoegd de auteur Squonk, de bron
Bedankt - ik heb het enigszins aangepast, maar het lost mijn probleem op.
toegevoegd de auteur Squonk, de bron

Limit is what you're looking for, it may just be your syntax. Check this out: How to get Top 5 records in SqLite?

0
toegevoegd