#mysql #join #views
#mysql #Присоединиться #число просмотров
Вопрос:
Я новичок в SQL и, вероятно, делаю это неправильно, но не могли бы вы помочь?
Мне нужно создать ПРЕДСТАВЛЕНИЕ в MySQL, но я не могу понять, как объединить эти два оператора SQL, поскольку представления не принимают несколько выборок или переменных.
ПРИМЕЧАНИЕ: второй оператор отлично работает при замене переменной @numberOfGames на правильное число (рассчитанное вручную).
Первый оператор — для возврата общего количества игр за год:
SELECT COUNT( id ) INTO @numberOfGames FROM tblgames WHERE gdate LIKE '2014%';
Второй оператор — для создания данных ПРЕДСТАВЛЕНИЯ:
SELECT
p.player AS player,
COUNT( c.gid ) AS gameCount,
SUM( c.cash ) AS cash,
ROUND( AVG( c.cash ), 2 ) AS avg,
SUM( ( CASE WHEN ( c.wotn > 0 ) THEN c.wotn ELSE 0 END ) ) AS wotn,
SUM( ( CASE WHEN ( c.cash > 0 ) THEN c.cash ELSE 0 END ) ) AS cashWon,
SUM( ( CASE WHEN ( c.cash < 0 ) THEN c.cash ELSE 0 END ) ) AS cashLost,
ROUND( AVG( ( CASE WHEN ( c.cash >= 0 ) THEN c.cash END ) ),2 ) AS avgWin,
ROUND( AVG( ( CASE WHEN ( c.cash < 0 ) THEN c.cash END ) ),2 ) AS avgLoss,
IF(
( ( COUNT( c.pid ) > ( @numberOfGames / 3 ) ) AND ( COUNT( c.pid ) > 2 ) ),
ROUND( ( ( AVG( c.cash ) * 10 ) 200 ), 2 ),
ROUND( AVG( c.cash ), 2 )
) AS sortingPoints
FROM tblplayers p
LEFT JOIN tblcash c ON p.id = c.pid
LEFT JOIN tblgames g ON g.id = c.gid
WHERE c.cash IS NOT NULL AND g.gdate LIKE '2014%'
GROUP BY c.pid
ORDER BY sortingPoints DESC;
Я использую переменные @numberOfGames для простого математического уравнения, которое проверяет, что игрок сыграл более трети от общего количества игр за год.
Я надеюсь, что кто-нибудь может помочь мне указать правильное направление.
Ответ №1:
Вы упускаете суть того, что делает представление.
Вы не можете сохранить несколько операторов в одном представлении. Это все равно, что пытаться сохранить две таблицы в одной таблице. Это невозможно.
Что вам нужно сделать, так это запустить свой первый Select, точно так, как он у вас есть. Сохраните его как представление. Затем вы можете использовать этот результирующий набор, как если бы это была любая другая живая таблица, и присоединять его к другим таблицам в последующих операторах Select .
Комментарии:
1. Спасибо за ответ durbnpoisn. Я понимаю, что я не могу использовать несколько операторов в представлении. Причина, по которой я показал первое утверждение, заключается в том, что оно возвращает общее количество игр за 2014 год, и это цифра, которую мне нужно использовать во втором утверждении @numberOfGames. Я не могу использовать СЧЕТ(g.id ) во втором операторе, поскольку он СГРУППИРОВАН ПО c.pid — который возвращает общее количество игр, сыгранных игроком, а не фактическое общее количество сыгранных игр. Надеюсь, это прояснит любую путаницу и надеюсь, что вы / кто-нибудь сможет помочь.