2个表,一个用dayofweek和id,另一个用date和id mysql查询

时间:2015-09-08 19:10:18

标签: mysql

我对mysql相当新,所以请保持温和。我试图围绕这个任务包围我的大脑,只是不知道该去哪里。在这一点上,我的大脑很脆弱,我正在寻找指导。

我有2张桌子:表演和表演。

节目有showid,基于星期几。因此,星期一节目有白痴1,星期二节目有白痴2等等。

另一方面,表演是节目发生的具体日期。所以showid包含在表演中,并且有一个日期显示。

我要做的是,例如,列出所有星期一节目,并与所有已录制的节目进行匹配,并指出哪些节目已被报道。

所以,如果我有3个星期一的节目,并且只报告了2个与showid相对应的表演。像下面的东西......

+--------+-------+-------+------------+----------+
| showid | dayid | show  | dateofshow | reported |
+--------+-------+-------+------------+----------+
|      1 |     1 | show1 | 9/07/2015  | Yes      |
|      2 |     1 | show2 | NULL       | NO       |
|      3 |     1 | show3 | 9/07/2015  | Yes      |
+--------+-------+-------+------------+----------+

... MySQL的

SELECT s.*, pr.*
            FROM shows as s             
            LEFT JOIN performances as pr
            ON s.showid = pr.showid

            WHERE s.dayid = 1 

再次感谢您的帮助。我的大脑被炒了。

更新:我之前没有讨论过,但是,显示日期必须在当前一周内。我已经更改了问题中的日期以更好地适应环境。在上面的“表格”中,您会注意到所报告的节目是针对2015年9月7日这是星期一。这些节目中的所有3个节目已经在2015年8月31日报道,这是前一周。所以再次,我正在寻找当前一周的dateofshow是“是”,如果dateofshow只是一个先前的日期,那么“否”。我希望这有所帮助,我相信我们已经到了那里。再次感谢您的帮助。

我试过这个......

SELECT s.showid, s.dayid, s.venueid, v.venue, v.venueid,
   pr.dateofshow, IF(pr.dateofshow = DATE('2015-09-07'), 'Yes', 'No') as reported FROM shows as s JOIN venues as v  ON s.venueid = v.venueid LEFT JOIN performances as pr
     ON s.showid = pr.showid
  WHERE s.dayid = 1 

对于在设定日期有表演的节目,它为我提供了'是'。并且对于在设定日期之前的日期有表演的节目提供“否”。现在我需要消除那些早于设定日期的那些,并且如果设置日期不存在性能,则执行“否”。

2 个答案:

答案 0 :(得分:0)

试试这个:

SELECT s.showid, s.dayid, s.show,
       pr.dateofshow, IF(pr.dateofshow is null,'NO','Yes') as reported
  FROM shows as s             
  LEFT JOIN performances as pr
         ON s.showid = pr.showid
      WHERE s.dayid = 1 
        AND pr.dateofshow > DATE_ADD(CURDATE(), INTERVAL(1-DAYOFWEEK(CURDATE())) DAY)

答案 1 :(得分:0)

不知道我是否得到了这个方面,但这是我不想尝试帮助你的。开始了。 我会尝试n:n关系来做我的判断。

    SELECT *, 
           CASE 
             WHEN (dateofshow IS NOT null) AND (dateofshow BETWEEN '2015-09-07' AND '2015-09-15' ) 
             THEN 'YES' 
             ELSE 'NO'   
           END
      FROM show 
      JOIN show_performance ON (show.id = show_performance.Idshow)            
      JOIN performance      ON (performance.id = show_performance.idPerformance)

创建了这样的表:

        CREATE TABLE show(
            id int IDENTITY(1,1) NOT NULL,
            name varchar(250) NULL      
         CONSTRAINT [PK_Show] PRIMARY KEY CLUSTERED 
        (
            [id] ASC
        )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
        ) ON [PRIMARY]


        CREATE TABLE performance(
            id int IDENTITY(1,1) NOT NULL,
            name varchar(250) NULL

         CONSTRAINT [PK_Performanse] PRIMARY KEY CLUSTERED 
        (
            [id] ASC
        )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
        ) ON [PRIMARY]


        CREATE TABLE show_performance(
            idshow int ,
            idPerformance int ,
            dateofshow  date null   

        )



        ALTER TABLE show_performance WITH CHECK ADD  CONSTRAINT FK_Performance FOREIGN KEY(idShow)
        REFERENCES [dbo].[show] ([Id])

        ALTER TABLE show_performance WITH CHECK ADD  CONSTRAINT FK_show FOREIGN KEY(idPerformance)
        REFERENCES [dbo].[performance] ([Id])

这是我的结果:

           id   name    idshow  idPerformance   dateofshow  id  name    (No column name)
            1   rock    1       2               NULL        2   metalica        NO
            2   pop     2       4               NULL        4   madona          NO
            3   popRock 3       1               NULL        1   iron  maiden    NO
            1   rock    1       1               2015-09-07  1   iron  maiden    YES
            2   pop     2       3               2015-09-30  3   michael jackson NO
            3   popRock 3       4               2015-10-08  4   madona          NO