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
Mocht je het nodig hebben:

SELECT
	ch.id,
	ch.name,
	ch.name_short,
	np.titel np_titel,
	np.datum_start np_start,
	np.datum_end np_end,
	ne.titel ne_titel,
	ne.datum_start ne_start,
	ne.datum_end np_end
FROM
	channels ch
LEFT JOIN
	programs np
	ON ch.id = np.channel_id AND NOW() BETWEEN np.datum_start AND np.datum_end
LEFT JOIN
	(SELECT
		channel_id,
		p.titel,
		datum_start,
		datum_end
	FROM
		(SELECT
			channel_id,
			MIN(datum_start) datum_start,
			MIN(datum_end) datum_end
		FROM
			programs
		WHERE
			datum_start > NOW()
		GROUP BY channel_id) c
	JOIN
		programs p
		USING (channel_id, datum_start, datum_end)
	) ne
	ON ch.id = ne.channel_id
Wow super! Ik neem aan dat deze manier wel trager is? Dus mocht het niet voorkomen kan ik beter de andere gebruiken?
De grootste vertragende factor is de geneste subquery met de group by, maar je kunt dat beperken door te filteren op alleen de records binnen de komende 24 uur.

En natuurlijk indexen zetten op de kolommen die in join voorwaarden voorkomen (dit geldt voor beide methodes)

En meten is weten! ;-)

Reageren