2016-12-12 2 views
0

У меня есть два раздела с играми, и у меня есть проблема. Когда игра в первом разделе, я не хочу показывать ее снова во втором разделе. Для показа игр в первой секции, которые я использую:Подзапрос mySQL с ошибкой ограничений

SELECT *,platform.platformName FROM games 
JOIN platform ON(platform.PlatformID=games.GamePlatform) 
WHERE GameDate <= NOW() AND GameSlide = 0 
GROUP BY GameName 
HAVING 1 
ORDER BY `games`.`GameDate` DESC LIMIT 8 

Для показа игр в второй секции:

SELECT *,platform.platformName 
FROM games 
JOIN platform ON(platform.PlatformID=games.GamePlatform) 
WHERE platform.PlatformID = 2 AND GameSlide = 0 
GROUP BY GameName 
HAVING 1 
order by rand(dayofyear(CURRENT_DATE)) 
LIMIT 8 

Я попытался сделать подзапрос так:

SELECT *,platform.platformName 
FROM games 
JOIN platform ON(platform.PlatformID=games.GamePlatform) 
WHERE games.GameID 
NOT IN(
     SELECT GameID 
     FROM games 
     WHERE GameDate <= NOW() AND GameSlide = 0 
     GROUP BY GameName 
     HAVING 1 
     ORDER BY `games`.`GameDate` DESC LIMIT 8 
    ) AND platform.PlatformID = 2 AND GameSlide = 0 
GROUP BY GameName 
HAVING 1 
order by rand(dayofyear(CURRENT_DATE)) LIMIT 8 

Но MySQL call error: #1235 - This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

Вы можете мне помочь? Прошу прощения за мой английский. Я сделал все что было в моих силах.

+0

MySQL или MariaDB? См. [Ограничения MySQL :: C.4 в подзапросах] (https://dev.mysql.com/doc/refman/5.7/en/subquery-restrictions.html) или [MariaDB :: Ограничения подзапроса] (https://mariadb.com/kb/en/mariadb/subquery-limitations/) – wchiquito

+0

Даже если это действительно сработало, 'ORDER BY GameDate DESC LIMIT 8'' не обязательно даст вам те же 8 записей в подзапросе, как и в запрос раздела 1 (если GameDate не уникален). Кроме того, я смущен тем, что для «ИДЕТ 1». Может быть полезно увидеть некоторые примеры записей. – Alan

+0

У меня много игр с одинаковым именем и той же датой выпуска Единственная разница в платформе. Например: GTA V для PS4, Xbox и ПК, и я хочу показать только один из них, поэтому я использовал HAVING 1 в GamesName. Мне нужно использовать 'Limid 8' и' order by GameDate Desc' в subqury, потому что, когда я удаляю 'LIMIT 8', Subquery возвращает все игры, поэтому результат ничего не показывает и когда я удаляю' ORDER BY GameDate DEST', t возвращает длительные игры. Если вы хотите, я могу отправить вам несколько screeshots с databese и веб-сайтом, как это выглядит и как я это понимаю. :) – Frederik

ответ

0

Я уже сделал это. Я создаю новый вид с выделенным.

CREATE VIEW Novinky AS SELECT games.GameID FROM games WHERE games.GameDate <= NOW() AND games.GameSlide = 0 GROUP BY games.GameName HAVING 1 ORDER BY `games`.`GameDate` DESC LIMIT 8 

И затем использовать NOT IN с SELECT, из просмотра:

SELECT *,platform.platformName FROM games JOIN platform ON(platform.PlatformID=games.GamePlatform) WHERE GameID NOT IN (SELECT * FROM novinky) AND platform.PlatformID = 2 AND GameSlide = 0 GROUP BY GameName HAVING 1 order by rand(dayofyear(CURRENT_DATE)) LIMIT 8 
+0

Я подозреваю, что есть более эффективное решение, но хорошо сделано. – Strawberry

Смежные вопросы