#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, который вы написали, с тем, который я поместил в предыдущем комментарии.