在mysql中以不同月份显示相同数据(或值)两次的查询

Posted

技术标签:

【中文标题】在mysql中以不同月份显示相同数据(或值)两次的查询【英文标题】:query of showing same data (or value) twice with different months in mysql 【发布时间】:2015-09-09 08:52:45 【问题描述】:

假设我有一个记录用户 id 的用户表,并且我有一个记录用户月份账单的 Bill_record 表。假设 XYZ 没有支付 1 月和 2 月的账单。现在在 3 月,我想查看前几个月的到期用户列表。如果运行

select c.User_ID from user as c where c.User_ID not in " + "(select b.User_ID from Bill_record as b where " + "b.User_ID = c.User_ID and " + "(b.Date between 2015-1-1 and 2015-2-28" + "))

它只显示 XYZ 一次,但我想看到它两次以及月份名称。在这种情况下,查询会是什么?

Update1:​​在这里我附上我的表格结构。

现在您可以从 bill_record 表中看到用户 10001,10002 没有支付 3 月、4 月和 5 月的账单。我想要一个包含 1001 和 10002 三次以及月份鬃毛的列表。

【问题讨论】:

你能上传你的表结构吗? @Blip 我已经附上了两个表的结构。第一个是 User 表,第二个是 bill_record 表 【参考方案1】:

您应该将查询分解为每月检查一次。根据您当前的查询编写方式,您只查找在 1 月 1 日至 2 月 28 日期间未支付任何账单的用户。

获取所有 1 月份未支付账单的用户:

SELECT 'January', u.id
FROM users u
WHERE u.id NOT IN(
  SELECT user_id
  FROM bills
  WHERE MONTH(payment) = 1);

同样,您也可以在二月份这样做。要组合它们,您可以使用 UNION:

SELECT 'January', u.id
FROM users u
WHERE u.id NOT IN(
  SELECT user_id
  FROM bills
  WHERE MONTH(payment) = 1)
UNION
SELECT 'February', u.id
FROM users u
WHERE u.id NOT IN(
  SELECT user_id
  FROM bills
  WHERE MONTH(payment) = 2);

这是一个SQL Fiddle 示例。

【讨论】:

我得到了你的答案,但我想要动态的。就像,如果用户在我的程序之间设置一个日期,我的程序将相应地显示当月到期用户的列表。 没有任何方法可以使用 mysql 查询,否则我可能会编写一段 java 代码来循环遍历月份并根据月份名称在循环内准备查询,然后将其连接在一起我终于可以有完整的查询了。【参考方案2】:

嗯,你可以查询一个日期范围。

SELECT *
FROM order_details
WHERE order_date >= CAST('2014-02-01' AS DATE)
AND order_date <= CAST('2014-02-28' AS DATE);

或者您的程序可以自己动态地执行它 - 就像运行一个小转换以仅显示它收到日期的月份。

【讨论】:

【参考方案3】:

使用以下查询

SELECT MONTHNAME(br.Date) AS Month, u.Name, u.User_ID, br.Bill_Tk FROM
Bill_record br
LEFT JOIN
user u on u.User_ID = br.User_ID
ORDER BY u.User_ID, MONTH(br.Date)

查看SQL Fiddle

【讨论】:

它显示了给定的用户 bill_record 但我想要到期的用户记录。根据您的数据库,我想查看此输出 - 月份名称 id bill January Farin 10001 800 Feb Farin 10001 800 Jan Farhan 10002 1000 Feb Farhan 10002 1000 Jan Sazzad 1122 800 Feb sazzad 1122 800 Mar sazzad 1122 800 Apr sazzad 1122 800 May 800 对不起,我之前的评论搞砸了。请查看此评论:它显示了给定的用户 bill_record,但我想要到期的用户记录。根据您的数据库,我想查看此输出 - (monthh name id bill)-> (January Farin 10001 800), (Feb Farin 10001 800); (Jan Farhan 10002 1000), (Feb Farhan 10002 1000); (Jan Sazzad 1122 800), (Feb sazzad 1122 800), (Mar sazzad 1122 800) (Apr sazzad 1122 800) (May sazzad 1122 800) @ErfanAhmedEmon 你如何计算账单是否到期? @ErfanAhmedEmon 我已编辑查询以包含您想要的内容。 我在我的问题上写的查询返回了一个月的到期用户,但如果用户有几个月的到期时间没有多次显示用户,那就是我的问题。对不起,你编辑的,我没看懂!除了顺序,输出保持不变! Farin 必须显示两次,farhan 必须显示两次,sazzad 必须显示五次!

以上是关于在mysql中以不同月份显示相同数据(或值)两次的查询的主要内容,如果未能解决你的问题,请参考以下文章

mysql 查询某个字段出现两次的数据

绘图图例显示未知项目/相同的图例项目以不同的线条显示两次

如何在不包含相同元素两次的情况下遍历列表?

如何在 DatePickerDialog 中以越南语显示月份和日期?

安排在不同时间执行两次的 cron 作业(AWS Beanstalk)

我想在具有子报告的水晶报告中以相同数据打印1份报告(两份(2份))?