【问题标题】:MySQL joining 2 tables Wrong output..the value multiplyMySQL加入2个表错误的输出..值相乘
【发布时间】:2020-09-18 01:35:32
【问题描述】:

我的 Capstone 项目遇到了一个大问题。我正在从我的数据库中加入 2 个表,但输出是

MY Query: select Distinct tbl_attendance_in.time_in as time_in, tbl_attendance_out.time_in as time_out from tbl_attendance_in join tbl_attendance_out on tbl_attendance_in.user_id=tbl_attendance_out.user_id where tbl_attendance_in.user_id=4 AND tbl_attendance_out.user_id=4;

我已经尝试过各种加入,比如内右、外右、内连接,但仍然没有成功。

【问题讨论】:

  • 我需要一些上下文。你想得到什么结果?来自特定用户的所有time_intime_out 或...?
  • 特定用户 sir 仅提供 time_in 和别名 (time_out)。两个表只有 2 个值,但输出有 4 次 |超时值1 |值 1 值 2 |值 2 值 1 |值 1 值 2 | Value2 它在重复。选择 distinct 也不起作用 T_T
  • Edit your question 并以文字而非图片的形式发布您的代码
  • 由于您仅加入用户 ID,并且两个表中的所有 4 条记录都具有相同的用户 ID,因此 sql 会生成记录的组合 => 2x2 记录将出现在结果集中。如果您想缩小匹配的数量,您需要定义要加入的其他字段。
  • 那个影子先生怎么样?

标签: mysql


【解决方案1】:

也许您可以先对两个表进行子查询,然后根据time_in 列的顺序生成行号。然后你在这两者之间做一个LEFT JOIN。类似于下面的示例查询:

SELECT A.user_id,A.time_in,B.time_in AS 'time_out' FROM
/*the first sub-query is for time in table*/
   (SELECT user_id, time_in,ROW_NUMBER() OVER (ORDER BY time_in) AS RowN 
    FROM tbl_attendance_in WHERE user_id=4) A 
LEFT JOIN
/*the second sub-query is for time out table*/
   (SELECT user_id, time_in,ROW_NUMBER() OVER (ORDER BY time_in) AS RowN 
    FROM tbl_attendance_out WHERE user_id=4) B
ON A.User_id=B.User_id AND A.RowN=B.RowN;

我正在使用ROW_NUMBER() OVER () 函数为每个行数据生成一个运行编号,然后在ON 中为LEFT JOIN 使用它。虽然这可以为您提供当前示例的结果,但考虑到其他因素(例如 time_in 和 time_out 的日期必须匹配,或者其中一个表中有任何重复(但有效)的时间戳),它可能不是最佳解决方案。

您可以考虑使用UNION ALL。示例如下:

SELECT 'IN' AS Opr, user_id, time_in AS records,ROW_NUMBER() OVER (ORDER BY time_in) AS RowN 
FROM tbl_attendance_in WHERE user_id=4 UNION ALL
SELECT 'OUT' AS Opr, user_id, time_in AS records,ROW_NUMBER() OVER (ORDER BY time_in) AS RowN 
FROM tbl_attendance_out WHERE user_id=4 order by RowN, records;

这也使用ROW_NUMBER() 函数进行排序,我添加了Opr 列来指示它来自哪个操作(或表)。

也许您可以尝试两者,看看是否可以使用它。如果您有其他顾虑,只需编辑您的问题并添加更多详细信息。

摆弄:https://dbfiddle.uk/?rdbms=mariadb_10.3&fiddle=087e4a7cabb5e50090639b5f3435aaa7

【讨论】:

  • 谢谢先生。我在 time_out 中尝试了 3 个值,在 time_out 中只尝试了 2 个值,这就是输出先生。 codeigniter 中的输出 Time_in value1 value2 Time_out value1 value2
【解决方案2】:

如果它与数据相乘,那么您可以在查询结束时使用 group by

select Distinct tbl_attendance_in.time_in as time_in,tbl_attendance_out.time_in as time_out from tbl_attendance_in join tbl_attendance_out on tbl_attendance_in.user_id=tbl_attendance_out.user_id where tbl_attendance_in.user_id=4 AND tbl_attendance_out.user_id=4 group by tbl_attendance_in.time_in,tbl_attendance_out.time_in  ;

这将对重复的行进行分组。

【讨论】:

  • 恐怕这不适用于您的 GROUP BY 方法。见dbfiddle.uk/…
  • 创建表 tbl_attendance_in (user_id int, time_in datetime); INSERT INTO tbl_attendance_in VALUES ('4','2020-09-14 19:59:15'), ('3','2020-09-14 19:59:18'); CREATE TABLE tbl_attendance_out (user_id int, time_out datetime);插入 tbl_attendance_out 值 ('4','2020-09-14 19:59:17'), ('3','2020-09-14 19:59:19');在表格中输入正确的数据
  • 你从哪里得到user_id=3?和'2020-09-14 19:59:17'的时间戳值?我在这里错过了什么吗?
  • 嗨,现在检查select tbl_attendance_in.user_id,tbl_attendance_in.time_in,tbl_attendance_out.time_out from tbl_attendance_in inner join tbl_attendance_out on tbl_attendance_out.user_id=tbl_attendance_in.user_id
猜你喜欢
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多