【问题标题】:how to do inner join with composite key如何使用复合键进行内连接
【发布时间】:2016-03-30 13:45:50
【问题描述】:

我有card_type 表,其中有card_idauto_increment 键和 cardtpeprimary key。另一张桌子 我拥有的是activities 表。活动表中的columnsactivity_idauto_increment 键和 activityprimary key。第三个表是actual_alldetails 表。这 actual_alldetails 中的列是 idauto_increment 键和 (emp_code,activity_id,card_id) 列与 composite key。这 第四个表是employee 表,这些表中的列是 emp_codeprimary keyemp_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;

它向我显示如下错误:

没有 GROUP 的 GROUP 列 (MIN(),MAX(),COUNT(),...) 的混合 如果没有 GROUP BY 子句,则列是非法的。

我不明白为什么它会显示这样的错误。是因为我正在使用一个主键和一个复合键进行内部连接吗? 如果我的预测是正确的,那么执行这些操作的正确查询是什么? 请帮我解决这个问题。

【问题讨论】:

    标签: mysql join composite-primary-key


    【解决方案1】:

    错误信息说:

    如果没有 GROUP BY 子句,则混合没有 GROUP 列的 GROUP 列(MIN()、MAX()、COUNT()、...)是非法的。

    您有一个 select 语句,其中包含一个聚合值 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;
    

    我猜你员工的 id 值:i.emp_code

    【讨论】:

      【解决方案2】:

      仔细观察这一行:

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

      这里有一个SUM() 函数,看起来非常很奇怪,很可能会触发您的错误消息。尝试删除SUM

      【讨论】:

        猜你喜欢
        • 2017-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-31
        • 1970-01-01
        • 1970-01-01
        • 2012-10-14
        • 2015-02-17
        相关资源
        最近更新 更多