Відповідь до вчорашньої задачки. Основні проблеми виловив sassa_nf:
SELECT some_date, COUNT(DISTINCT x) as num_x, COUNT(DISTINCT z)
FROM t3
WHERE some_date > some_start_date AND some_date < some_end_date
AND x IN (
SELECT x
FROM t1
WHERE SUBSTRING(y, 1, 11) = 'some_string'
AND LOWERCASE(x) LIKE '%some_other_string%'
AND LOWERCASE(x) NOT LIKE '%yet_another_string%'
)
GROUP BY some_date
ORDER BY num_x
LIMIT 10
UPDATE: Якщо кому не віриться, ось варіант з JOIN'ом, трохи симетричніший на вигляд, а виконується за той самий час або трохи довше, залежно від платформи:
SELECT some_date, COUNT(DISTINCT x) as num_x, COUNT(DISTINCT z)
FROM
(SELECT x
FROM t1
WHERE SUBSTRING(y, 1, 11) = 'some_string'
AND LOWERCASE(x) LIKE '%some_other_string%'
AND LOWERCASE(x) NOT LIKE '%yet_another_string%')
INNER JOIN
(SELECT x,z,some_date
FROM t3
WHERE some_date > some_start_date AND some_date < some_end_date)
USING(x)
GROUP BY 1 ORDER BY 2 LIMIT 10
Але верхній варіант швидший... імхо
SELECT some_date, COUNT(DISTINCT x) as num_x, COUNT(DISTINCT z)
FROM t3
WHERE some_date > some_start_date AND some_date < some_end_date
AND x IN (
SELECT x
FROM t1
WHERE SUBSTRING(y, 1, 11) = 'some_string'
AND LOWERCASE(x) LIKE '%some_other_string%'
AND LOWERCASE(x) NOT LIKE '%yet_another_string%'
)
GROUP BY some_date
ORDER BY num_x
LIMIT 10
UPDATE: Якщо кому не віриться, ось варіант з JOIN'ом, трохи симетричніший на вигляд, а виконується за той самий час або трохи довше, залежно від платформи:
SELECT some_date, COUNT(DISTINCT x) as num_x, COUNT(DISTINCT z)
FROM
(SELECT x
FROM t1
WHERE SUBSTRING(y, 1, 11) = 'some_string'
AND LOWERCASE(x) LIKE '%some_other_string%'
AND LOWERCASE(x) NOT LIKE '%yet_another_string%')
INNER JOIN
(SELECT x,z,some_date
FROM t3
WHERE some_date > some_start_date AND some_date < some_end_date)
USING(x)
GROUP BY 1 ORDER BY 2 LIMIT 10
Але верхній варіант швидший... імхо