Py学习  »  DATABASE

如何将两个表字段名与MySQL中的另一个值进行比较?

diEcho • 6 年前 • 1451 次点击  

我有两张桌子

  1. 表学校

    school_open_time|school_close_time|school_day
    8:00 AM         | 9:00PM          | Monday
    10:00 AM        | 7:00PM          | Wednesday
    
  2. 表学院

     college_open_time|college_close_time|college_day    
     10:00 AM         | 8:00PM           | Monday
     10:00 AM         | 9:00PM           | Tuesday
     10:00 AM         | 5:00PM           | Wednesday
    

现在我想选择 school_open_time school_close time , college_open_time college_close_time 根据今天(意思是 college_day=school_day=today ,如果某个表中没有特定日期的行,则显示空白字段。( LEFT JOIN ,我想我可以用)。

请为此向我建议最佳和优化的查询。

更新:

如果学校没有开放时间和关闭时间,那么大学开放时间和大学关闭时间必须作为学校开放时间和学校关闭时间返回(不填写数据库,只返回)。一定要有一天的大学开放时间和大学关闭时间


我使用下面的查询

 SELECT college_open_time,college_close_time ,school_open_time,
        school_close_time  FROM tbl_college
 LEFT JOIN tbl_school ON school_owner_id=college_owner_id 
 WHERE college_owner_id='".$_session['user_id']."' AND
 college_day='".date('l',time())."'";

当表中没有某一天的行时,返回单行(左手有一些值,右手有空白值),但在左手边显示七行相同值(大学开放时间、大学关闭时间),在右手边显示六行相同值(学校开放时间和学校关闭时间)。

i need only one row when both table have a row of a given day

但是使用上面的查询只取对应表的第一行“学校”,其中“学校所有者”ID为50(let),它看不到“学校日名称”应为“天”的条件。


更多更新@37stars

还有一点问题,亲爱的, 学校关闭时间和学校开放时间的数据类型为 TIME 类型 而大学开放时间和大学关闭时间的数据类型是 VARCHAR 类型。 我使用了你给出的下面的代码,但我做了一些修改,我接近了结果。

但是现在告诉我在下面的代码段中我必须在哪里写ifnull

ifnull(time_format())或time_format(ifnull())

SELECT TC.owner_id,college_open_time AS collegeOpen, 
       college_close_time AS collegeClose, 
TIME_FORMAT(school_open_time, '%h:%i %p' ) AS schoolOpen,       
TIME_FORMAT(school_close_time, '%h:%i %p' ) AS schoolClose
FROM tbl_college TC
LEFT JOIN tbl_school  TS ON TS.owner_id = TC.owner_id
AND TC.college_day = TS.school_day
WHERE college_day = DATE_FORMAT(NOW(),'%W')

解决方案

感谢37颗星,你的和蔼可亲,谢谢你的伊夫鲁姆之意,

我在写最佳和最佳的查询

SELECT TC.owner_id,college_open_time AS collegeOpen,college_close_time AS 
    collegeClose, IFNULL(TIME_FORMAT(school_open_time, '%h:%i %p'),college_open_time) 
    AS schoolOpen,IFNULL(TIME_FORMAT(school_close_time, '%h:%i %p',college_close_time)
    AS schoolClose FROM tbl_college TC LEFT JOIN tbl_school TS 
    ON TS.owner_id = TC.owner_id AND TC.college_day = TS.school_day 
    WHERE college_day = DATE_FORMAT(NOW(),'%W') 
    FROM tbl_storecalendar TS LEFT JOIN tbl_delivery_hours TD 
    ON TD.store_id = TS.store_id 
    AND TD.del_day = TS.dayName WHERE dayName = DATE_FORMAT( NOW( ) , '%W' )
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30351
文章 [ 4 ]  |  最新文章 6 年前
zombat
Reply   •   1 楼
zombat    15 年前

如果您想在一个查询中完成此操作,则必须使用 UNION 要将结果组合在一起,请执行以下操作:

SELECT school_open_time AS openTime,`int` AS school_close_time
    FROM table_school WHERE school_day=DATE_FORMAT(NOW(),'%W')
UNION
SELECT college_open_time AS openTime,`int` AS college_close_time
    FROM table_college WHERE college_day=DATE_FORMAT(NOW(),'%W');

在哪里? DATE_FORMAT(NOW(),'%W') 转换为一周中的当前日期。

然而,这种方法对我来说并不是很好。首先,在缺少记录的情况下,它不会处理将空方法放入结果集中的问题。您可以添加一些if/else语句来实现这一点,但老实说,我可能只需要从您的PHP代码中进行两个独立的查询。这样,您就可以具体地处理每个问题,并更容易地从中控制结果。

Summer
Reply   •   2 楼
Summer    15 年前

我建议将数据库结构更改为具有以下结构的两个表:

<代码> 表机构:
机构编号
表时间:
机构日开放时间关闭时间
< /代码>

您可以轻松地将现有的两个表放入新的时间表,即
<代码> 插入时间(机构、日期、开放时间、关闭时间)
选择“学校”、“学校日”、“学校开放时间”、“学校关闭时间”
来自Table_School
< /代码>

然后很容易得到查询结果:
<代码> 选择i.机构,t.开放时间,t.关闭时间
从时间t
Left join institutions i on t.institution_id=i.institution_id
其中day='wednesday'
< /代码>


表时间:
机构日开放时间关闭时间

您可以轻松地将现有的两个表放入新的时间表,即
插入时间(机构、日期、开放时间、关闭时间)
选择“学校”、“学校日”、“学校开放时间”、“学校关闭时间”
从桌上学校

然后很容易得到查询结果:
选择I.机构,T.开放时间,T.关闭时间
从时代T
左加入机构i on t.institution_id=i.institution_id
其中day='wednesday'

Mark Byers
Reply   •   3 楼
Mark Byers    15 年前

您需要一个完整的外部连接,但不幸的是,MySQL不支持这种连接。幸运的是,通过使用 UNION ALL :

更新:更改查询以回答OP更新的问题。

SELECT
    COALESCE(school_day, college_day) AS day,
    COALESCE(school_open_time, college_open_time) AS school_open_time,
    COALESCE(school_close_time, college_close_time) AS school_close_time,
    COALESCE(college_open_time, school_open_time) AS college_open_time,
    COALESCE(college_close_time, school_close_time) AS college_close_time
FROM (
    SELECT * FROM table_school LEFT JOIN table_college ON school_day = college_day
    UNION ALL
    SELECT * FROM table_school RIGHT JOIN table_college ON school_day = college_day
    WHERE school_day IS NULL
) AS T1
37Stars
Reply   •   4 楼
37Stars    15 年前

你需要添加 学校日=大学日 加入条款。

SELECT college_open_time, college_close_time, school_open_time, school_close_time
FROM dbo.tbl_college AS TC
    LEFT JOIN dbo.tbl_school AS TS ON TS.owner_id = TC.owner_id 
    AND TS.school_day = TC.college_day
WHERE TC.owner_id = 1 
    AND college_day = 'tuesday'