【问题标题】:Mysql Match and output two rowsMysql匹配并输出两行
【发布时间】:2013-02-09 12:00:11
【问题描述】:

Mysql 查询匹配和连接给定日期的两行。嗨,我是新手,已经用谷歌搜索并搜索了几天的堆栈溢出,但我找不到答案。请帮忙解决以下问题

我有一张桌子:人

Id   Leader Name1   Name2   StartDate  EndDate
123  1      Person1         2013-02-11 2013-02-17
123  0              Person2 2013-02-13 2013-02-13
123  0              Person3 2013-02-13 2013-02-13

我有一个问题1

(SELECT t1.Id, t1.Name1, t1.Name2
 FROM `dbo`.`people` t1
WHERE t1.StartDate >= '2013-02-11'
AND t1.Leader = 1)

UNION 

(SELECT t2.Id, t2.Name1, t1.Name2
FROM `dbo`.`people` t2
WHERE t2.StartDate >= '2013-02-11'
AND t2.Leader = 0)

返回

Id   Name1   Name2
123, Person1 

我有一个问题2

(SELECT t1.Id, t1.Name1, t1.Name2
FROM `dbo`.`people` t1
WHERE t1.StartDate >= '2013-02-13'
AND t1.Leader = 1)

UNION 

(SELECT t2.Id, t2.Name1, t1.Name2
FROM `dbo`.`people` t2
WHERE t2.StartDate >= '2013-02-13'
AND t2.Leader = 0)

返回

Id   Name1   Name2
123, Person1 
123,         Person2
123,         Person3

我需要显示 2012-02-11 的结果

Id   Name1   Name2
123, Person1 null

并为 2012-02-13 展示

Id   Name1   Name2
123, Person1 Person2
123, Person1 Person3

【问题讨论】:

  • 您的表定义是否包括 Name2 的 NOT NULL?如果您包含此查询的结果可能会有所帮助:解释人员
  • Field,Type,Null,Key,Default,Extra Counter,int(11),NO,PRI,NULL, id,int(11),YES,,NULL, leader,int(11) ,YES,,NULL, name1,varchar(45),YES,,NULL, name,varchar(45),YES,,NULL, startdate,varchar(45),YES,,NULL, enddate,varchar(45),YES ,,NULL,

标签: mysql


【解决方案1】:

你为什么要做这些工会?您知道 union 将两个结果集加在一起而不进行比较,是吗?也许您正在尝试进行自我加入?如果是这样,你会在这里找到一个例子:How does a MYSQL Self-Join Work?

另外,您的表格是否标准化?见http://en.wikipedia.org/wiki/Database_normalization 如果你把桌子分开,你可能会有更好的时间。一个常见的初学者错误是试图将太多信息塞进一张表中。为什么你有'名字1'和'名字2'?如果您为领导者存储的信息与非领导者的信息不同,那么也许您应该有一个单独的“领导者”表,然后将它们与一个 id 相关联。为什么在您的表中 id 列总是相同的?那个id是干什么用的?这些人是否属于同一个群体?

这里还有一些关于联接的附加信息,可能有助于您理解:

http://dev.mysql.com/doc/refman/5.0/en/join.html

http://en.wikipedia.org/wiki/Join_%28SQL%29

【讨论】:

  • 我理解同一张表join的语法。从以下查询结果连接的语法是什么: (SELECT t1.Id, t1.Name1, t1.Name2 FROM dbo.people t1 WHERE t1.StartDate >= '2013-02-13' AND t1.Leader = 1) UNION (SELECT t2.Id, t2.Name1, t1.Name2 FROM dbo.people t2 WHERE t2.StartDate >= '2013-02-13' AND t2.Leader = 0)
  • 语法将与我的答案中的 self join 相同。您希望您的选择具有 t1.Name1、t2.Name2 并且您将加入 id。同样,您应该考虑重新设计您的表格。如果你不这样做,你最终会遇到很多混乱的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 2012-10-31
  • 1970-01-01
  • 2018-10-25
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多