(Новичок) Представление MySQL

#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 — который возвращает общее количество игр, сыгранных игроком, а не фактическое общее количество сыгранных игр. Надеюсь, это прояснит любую путаницу и надеюсь, что вы / кто-нибудь сможет помочь.