Posts Tagged ‘MySQL’

Tajuplné MySQL

Pondělí, Září 24th, 2007

English version of this post available here

MySQL někdy dokáže překvapit. Teď jsem například narazil na toto: Mám tento SQL dotaz:

SELECT id, username, locked, c.*,
(SELECT COUNT(*)
FROM web_login_users
WHERE user=id AND (NOW()-last_action)<600) AS login_count
FROM web_users
LEFT JOIN web_user_information AS c ON (id=user)

Ten bez problému funguje a jako jeden ze sloupců se vrátí sloupec login_count. Chtěl jsem vybrat pouze řádky, kde je login_count větší než jedna. Intuitivně jsem zkusil toto:

SELECT id, username, locked, c.*,
(SELECT COUNT(*)
FROM web_login_users
WHERE user=id AND (NOW()-last_action)<600) as login_count
FROM web_users
LEFT JOIN web_user_information AS c ON (id=user)
WHERE login_count > 1

To ale nefunguje. MySQL hlásí, že nezná sloupec login_count.

Zajímavé je, že toto funguje:

SELECT id, username, locked, c.*,
(SELECT COUNT(*) FROM web_login_users
WHERE user=id AND (NOW()-last_action)<600) AS login_count
FROM web_users
LEFT JOIN web_user_information AS c ON (id=user)
ORDER BY login_count
Bude se to muset zřejmě obejít přes JOIN.

Po několika pokusech a konzultaci s kamarádem se vzdávám.

Pokus s JOIN

SELECT id, username, locked, c.*,
COUNT(login_users.user) AS login_count
FROM web_users
LEFT JOIN web_user_information AS c ON (id=user)
LEFT OUTER JOIN web_login_users AS login_users
ON (user=id AND (NOW()-last_action)<600)
WHERE login_count > 0

končí stejnou hláškou jako předešlé (Unknown column ‚login_count‘ in ‚where clause‘).

Toto se mi sice nelíbí, ale alespoň to funguje:

SELECT id, username, locked, c.*,
(SELECT COUNT(*) FROM web_login_users WHERE
user=id AND (NOW()-last_action)<600) AS login_count
FROM web_users LEFT JOIN web_user_information AS c ON (id=user)
WHERE (SELECT COUNT(*) FROM web_login_users
WHERE user=id AND (NOW()-last_action)<600) > 0