Allen,

Het is de bedoeling dat een 'closest event' en de daarop volgende worden weergeven.
Ik heb 2 tabellen. Één moet gewoon 'gejoint' zijn en de andere bevat de datums datum_start en datum_end.
Nou wil ik de data die het dichtst bij nu ligt (of een eigen datum) of wat in ieder geval tussen start en end valt. Maar ook de daarop volgende.
Dus nu en volgende. Zoiets als Nu&Straks van een tvgids.
Lastig uitgelegd, maar kan iemand me op weg helpen?


    $sql = "
	SELECT
		ch.id,
		ch.name,
		ch.name_short,
		pr.channel_id,
		pr.db_id,
		pr.titel,
		pr.datum_start,
		pr.datum_end
	FROM
		" .  TABLE_PREFIX . "channels AS ch
	LEFT JOIN
		" . TABLE_PREFIX . "programs AS pr
		ON ch.id = pr.channel_id
	WHERE
		pr.titel IS NOT NULL
		AND (
		CURRENT_DATE BETWEEN
			pr.datum_start
		AND
			pr.datum_end
		OR
			pr.datum_start =
			(
				SELECT
					MIN(pr.datum_start)
					FROM
						" . TABLE_PREFIX . "programs
				WHERE
					pr.datum_start > CURRENT_DATE
			)
		)
	";

Geeft error: SQLSTATE[HY000]: General error: 1111 Invalid use of group function

Bvd
MIN(), MAX(), AVG() en anderen zijn functies die alleen gebruikt kunnen worden als je een GROUP BY clause hebt.

In dit geval zou je met een ORDER BY pr.datum_start ASC LIMIT 1 moeten krijgen wat hebben wilt. En MIN() weglaten natuurlijk.
> In dit geval zou je met een ORDER BY pr.datum_start ASC LIMIT 1 moeten krijgen wat hebben wilt. En MIN() weglaten natuurlijk.

Er is natuurlijk ook data wat in het verleden ligt en data dat in de toekomst ligt. Dus sorteren zou mijn alleen de eerste datum geven, niet de datum die hoort bij 14 mei 2014 10 over 9.
Daarnaast werkt LIMIT 1 ook niet, want ik wil van elke ch.id de tijd die bij nu hoort. En de daarop volgende.

Sorry voor de onduidelijke uitleg.
...
            pr.datum_start =
            (
                SELECT
                    pr.datum_start
                    FROM
                        " . TABLE_PREFIX . "programs
                WHERE
                    pr.datum_start > CURRENT_DATE
                ORDER BY
                    pr.datum_start ASC
                LIMIT 1
            )
...

Dat is wat ik bedoelde.
En LIMIT 2 als je de eerstvolgende en de daarop volgende wil hebben...
Ah, dan begreep ik je verkeerd :) Bedankt voor t voorbeeld. Deze geeft alleen een time-out 'SQLSTATE[HY000]: General error: 2013 Lost connection to MySQL server during query'
>> En LIMIT 2 als je de eerstvolgende en de daarop volgende wil hebben...
Een subquery in de where achter = kan nooit meer dan één waarde teruggeven.

@Michael
Waarom gebruik je een LEFT JOIN en controleer je daarna een kolom van de gejoinde tabel op IS NOT NULL?

Ger van Steenderen op 14/05/2014 10:26:39

>> En LIMIT 2 als je de eerstvolgende en de daarop volgende wil hebben...
Een subquery in de where achter = kan nooit meer dan één waarde teruggeven.

Helemaal gelijk natuurlijk, ik had niet in de gaten dat die subquery op die manier gebruikt werd....

> Waarom gebruik je een LEFT JOIN en controleer je daarna een kolom van de gejoinde tabel op IS NOT NULL?

Omdat er data doorheen kwam die niet compleet was. Als de titel null is heb ik er niks aan.

Iemand nog een idee waarom de query blijft laden of error lost connection gooit?
>> Omdat er data doorheen kwam die niet compleet was. Als de titel null is heb ik er niks aan.

Dat begrijp ik, maar waarom dan een LEFT JOIN, een INNER JOIN heeft hetzelfde effect.

Welke query heb je nu?
Ah oké. Moet toegeven dan JOIN's maar lastige dingen blijven al lijken ze zo makkelijk :)

tot nu toe

    $sql = "
	SELECT
		ch.id,
		ch.name,
		ch.name_short,
		pr.channel_id,
		pr.db_id,
		pr.datum_start,
		pr.datum_end
	FROM
		" .  TABLE_PREFIX . "channels AS ch
	LEFT JOIN
		" . TABLE_PREFIX . "programs AS pr
		ON ch.id = pr.channel_id
	WHERE
		pr.datum_start =
            (
                SELECT
                    pr.datum_start
                    FROM
                        " . TABLE_PREFIX . "programs
                WHERE
                    pr.datum_start > CURRENT_DATE
                ORDER BY
                    pr.datum_start ASC
                LIMIT 1
            )
	";

Dit levert oneindig laden op of soms een 'lost connection'

Reageren