Я не могу получить max из подсчитанного значения в sql

#mysql #sql

#mysql #sql

Вопрос:

У меня есть две таблицы.В таблице t1 есть столбцы (ID, Name), а в таблице t2 есть столбцы (ID, дата, время)…Я хочу запустить запрос типа

 select t1.Name,t2.ID,count(t2.Date)as Present_Days,MAX(x) as total 
FROM (SELECT COUNT(t2.ID) AS x FROM t2 GROUP BY ID) as y 
from t1 
INNER JOIN t2 on t1.ID=t2.ID 
group by Name
  

Когда я удаляю эту строку «MAX (x) как total FROM (ВЫБЕРИТЕ COUNT (t2.ID ) КАК x ИЗ ГРУППЫ t2 ПО ИДЕНТИФИКАТОРУ) как y» из запроса, это дает результат .. но исходный запрос не работает…Что можно сделать для выполнения этого запроса.

Комментарии:

1. Каким должен быть результат запроса?

2. Я имею в виду, что запрос, который вы показали, синтаксически неверен, и мы можем помочь вам написать правильный запрос: но чтобы помочь вам написать «правильный» запрос, вам нужно рассказать нам что-то еще о том, что представляют таблицы и чего вы пытаетесь достичь

3. @Stan . . . Пожалуйста, отредактируйте свой вопрос и предоставьте образцы данных и желаемые результаты. Запрос действительно не имеет смысла.

Ответ №1:

Неверно Из () динамической таблицы и два ИЗ вместо правильного внутреннего соединения, возможно, вы ищете что-то вроде этого

   select 
       t1.Name
      ,t2.ID
      ,count(t2.Date) as Present_Days
      ,MAX(y.x) as total 
  FROM ( 
          SELECT t2.ID, COUNT(t2.ID) AS x 
          FROM t2 
          GROUP BY ID
        )  y 
  INNER  JOIN  t1 on y.ID = t1.ID
  INNER JOIN t2 on t1.ID=t2.ID 
  group by t1.Name, t2.ID
  

и если вам нужен другой столбец с именем time из t2, вы могли бы использовать

   select 
       t1.Name
      ,t2.ID
      ,count(t2.Date) as Present_Days
      ,MAX(y.x) as total 
      , t2.`time`
  FROM ( 
          SELECT t2.ID, COUNT(t2.ID) AS x 
          FROM t2 
          GROUP BY ID
        )  y 
  INNER  JOIN  t1 on y.ID = t1.ID
  INNER JOIN t2 on t1.ID=t2.ID 
  group by t1.Name, t2.ID, t2.`time`
  

несмотря на то, что вы присоединяетесь к таблице t2, вы можете напрямую выбрать t2.time в главном меню выбора..

В любом случае вы могли бы выбрать t2.time также из подвыборки, правильно добавив этот столбец в подзапрос и используя соответствующий псевдоним, такой как столбец my_time в примере ниже

   select 
       t1.Name
      ,t2.ID
      ,count(t2.Date) as Present_Days
      ,MAX(y.x) as total 
      , y.my_time
  FROM ( 
          SELECT t2.ID, t2.`time` as my_time, COUNT(t2.ID) AS x 
          FROM t2 
          GROUP BY ID
        )  y 
  INNER  JOIN  t1 on y.ID = t1.ID
  INNER JOIN t2 on t1.ID=t2.ID 
  group by t1.Name, t2.ID, t2.`time`
  

и для absent_days вы можете использовать разницу между двумя задействованными столбцами (без псевдонима)

   select 
       t1.Name
      ,t2.ID
      ,count(t2.Date) as Present_Days
      ,MAX(y.x) as total 
      , t2.`time`
      , MAX(y.x) - count(t2.Date) as Absent_Days
  FROM ( 
          SELECT t2.ID, COUNT(t2.ID) AS x 
          FROM t2 
          GROUP BY ID
        )  y 
  INNER  JOIN  t1 on y.ID = t1.ID
  INNER JOIN t2 on t1.ID=t2.ID 
  group by t1.Name, t2.ID, t2.`time`
  

если вам нужен фильтр по имени, вы можете

   select 
       t1.Name
      ,t2.ID
      ,count(t2.Date) as Present_Days
      ,MAX(y.x) as total 
      , t2.`time`
      , MAX(y.x) - count(t2.Date) as Absent_Days
  FROM ( 
          SELECT t2.ID, COUNT(t2.ID) AS x 
          FROM t2 
          GROUP BY ID
        )  y 
  INNER  JOIN  t1 on y.ID = t1.ID
  INNER JOIN t2 on t1.ID=t2.ID 
  where   t1.Name =  'somename' 
  group by t1.Name, t2.ID, t2.`time`
  

Комментарии:

1. Не следует t2.id быть добавленным в группу с помощью? (однако так было и в исходном запросе)

2. Это должно было быть select t1.Name ,t2.ID ,count(t2.Date) as Present_Days ,MAX(y.x) as total FROM ( Select t2.id, COUNT(t2.ID) AS x FROM t2 GROUP BY ID ) y INNER JOIN t1 on y.ID = t1.ID INNER JOIN t2 on t1.ID=t2.ID group by t1.Name, t2.id

3. Спасибо всем за вашу помощь

4. @Stan конечно, t2. ИДЕНТИФИКАТОР должен быть добавлен в group by .. .. в вашем запросе с group by было несколько проблем .. это было очевидно.. я обновил asnwer, добавив t2.ID в gorup by хорошо, если мой ответ правильный, пожалуйста, отметьте его как принятый … смотрите, как здесь meta.stackexchange.com/questions/5234 /…

5. @scaisEdge есть еще пара вещей, которые делают этот запрос «недопустимым SQL». Вложенный запрос не начинается с «SELECT», и есть «ВНУТРЕННИЙ» без «JOIN». Вы можете сравнить SQL, который вы написали, с тем, который я поместил в предыдущем комментарии.