Это может быть эквивалентно, но легче для чтения:
WITH NIDs(type_value,nid) AS (
SELECT 'event', nid FROM tournament_event
WHERE type_value IN ('A','B','C')
UNION ALL
SELECT 'new_event', nid FROM user_tournament_event
WHERE type_value IN ('X','Y')
)
SELECT
u.uid,
u.username,
u.nid,
wd.pay
FROM users_data AS u JOIN NIDs AS n
ON n.nid = u.nid
AND n.type_value = u."type"
LEFT JOIN winners_data AS wd
ON u.nid=wd.nid AND u.uid=wd.uid
LEFT JOIN dp_node AS dn
ON u.nid = dn.nid
WHERE u.uid=".$val."
ORDER BY nid ASC
Если «какое событие» является важным, вам лучше использовать одну таблицу, из которой вы можете сделать это определение, посмотрев на один или два столбца. Похоже, у вас есть две таблицы, содержащие эту информацию (tour_event и user_tournament_event). Например, вы можете хранить информацию, как в выражении NID этого запроса.
Добавлено 2009-08-22:
Вот тот же запрос с CTE, выраженным как производная таблица:
SELECT
u.uid,
u.username,
u.nid,
wd.pay
FROM users_data AS u JOIN (
SELECT 'event', nid FROM tournament_event
WHERE type_value IN ('A','B','C')
UNION ALL
SELECT 'new_event', nid FROM user_tournament_event
WHERE type_value IN ('X','Y')
) AS n(type_value,nid)
ON n.nid = u.nid
AND n.type_value = u."type"
LEFT JOIN winners_data AS wd
ON u.nid=wd.nid AND u.uid=wd.uid
LEFT JOIN dp_node AS dn
ON u.nid = dn.nid
WHERE u.uid=".$val."
ORDER BY nid ASC