2016-03-30 3 views
0

У меня есть card_type таблицу, в которой есть card_id является auto_increment ключ и cardtpe является primary key. Другая таблица которая у меня есть activities стол. columns в действии Таблица : activity_id с auto_increment ключ и activity столбец с primary key. Третья таблица - actual_alldetails стол. Столбы в actual_alldetails: id с auto_increment ключ и (emp_code,activity_id,card_id) столбец с composite key. Четвертый стол составляет employee Таблица и столбцы в этой таблице: emp_code с primary key и emp_name.как сделать внутреннее соединение с композитным ключом

Когда я пытаюсь выполнить один из моего запроса: -

SELECT i.*, 
     d.Date, 
     a.in_time, 
     a.out_time, 
     SEC_TO_TIME(SUM(TIME_TO_SEC(a.out_time))-(TIME_TO_SEC(a.in_time))) AS duration, 
     c.cardtype, 
     a.wo, 
     v.activity, 
     a.quty, 
     a.wastage, 
     a.mcusage, 
     a.actual_wastage 
FROM employee_details i 
INNER JOIN actual_alldetails a ON i.emp_code=a.emp_code 
INNER JOIN attendance_date d ON d.date_id=a.date_id 
INNER JOIN card_type c ON c.card_id=a.card_id 
INNER JOIN activities v ON v.activity_id=a.activity_id 
WHERE d.Date='2016-01-30' 
ORDER BY v.activity; 

Он показывает мне ошибку, как:

Mixing столбцов GROUP (MIN(), MAX(), COUNT(), ...) без столбцов GROUP является незаконным, если нет предложения GROUP BY.

Я не понимаю, почему это покажет мне такую ​​ошибку. Это потому, что я делаю внутреннее соединение с одним основным ключом и одним составным ключом? Если мое предсказание правильно, то каков правильный запрос для этого? Пожалуйста, помогите мне решить эту проблему.

ответ

0

Присмотритесь на этой линии:

SEC_TO_TIME(SUM(TIME_TO_SEC(a.out_time))-(TIME_TO_SEC(a.in_time))) AS duration,

Существует SUM() функция здесь выглядит очень нечетное и, скорее всего, вызывает ваше сообщение об ошибке. Попробуйте удалить SUM.

1

сообщение об ошибке говорит, что это:

Смешение GROUP столбцов (MIN(), MAX(), COUNT(), ...) без GROUP столбцов является незаконным, если нет предложения GROUP BY ,

у вас есть оператор выбора, который содержит агрегированное значение SUM(TIME_TO_SEC(a.out_time) и неагрегированного значение TIME_TO_SEC(a.in_time)

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

Например изменить запрос к этому:

SELECT i.*, 
    d.Date, 
    a.in_time, 
    a.out_time, 
    SEC_TO_TIME(SUM(TIME_TO_SEC(a.out_time))-(TIME_TO_SEC(a.in_time))) AS duration, 
    c.cardtype, 
    a.wo, 
    v.activity, 
    a.quty, 
    a.wastage, 
    a.mcusage, 
    a.actual_wastage 
FROM employee_details i 
INNER JOIN actual_alldetails a ON i.emp_code=a.emp_code 
INNER JOIN attendance_date d ON d.date_id=a.date_id 
INNER JOIN card_type c ON c.card_id=a.card_id 
INNER JOIN activities v ON v.activity_id=a.activity_id 
WHERE d.Date='2016-01-30' 
GROUP BY i.emp_code 
ORDER BY v.activity; 

Я предполагаю, что при значении идентификатора ваших сотрудников: i.emp_code