MySQL 双左连接返回与预期结果相反的结果

标签 mysql database left-join

我正在尝试确定哪些人尚未在 2017 年 7 月 1 日至 12 月 31 日期间的所有星期六进行电话预订。

在 MySQL 中,我有两个表和 1 个 View : j3_aqi_userdata_v( View ) j3_sv_apptpro3_requests(表) j3_oncall_calendar_dates(表)

我需要从 j3_aqi_userdata_v 获取未出现在 j3_sv_apptpro3_requests 中的所有人员的列表。简单的左连接应该可以做到,但不是那么多。你可能会问为什么?嗯,我还需要在 where 子句中添加一些语句,以排除非星期六的日子、非当年的年份以及一月到六月的月份。

我有以下内容,但它只返回已电话预订的人:

select 
*
from 
j3_aqi_userdata_v t1
    left join (j3_sv_apptpro3_requests t2)
        on (t1.id=t2.user_id)
    left join j3_oncall_calendar_dates t3
        on (t2.startdate=t3.db_date)
where 
t3.saturday_flag = 'T'
and 
t3.year=year(current_date)
and
t3.month >= 7

有人知道我做错了什么吗?

表结构:

j3_aqi_userdata_v
    #   Name    Type    Collation   Attributes  Null    Default     Comments    Extra
    1   id  int(11)             No  0       
    2   author  varchar(400)    utf8mb4_general_ci      No          
    3   username    varchar(150)    utf8mb4_general_ci      No          
    4   email   varchar(100)    utf8mb4_general_ci      No          
    5   employeeid  bigint(21)          No  0       
    6   coach   longtext    utf8mb4_general_ci      Yes     NULL        
    7   geo     longtext    utf8mb4_general_ci      Yes     NULL        
    8   team    longtext    utf8mb4_general_ci      Yes     NULL        
    9   manager     longtext    utf8mb4_general_ci      Yes     NULL        
    10  country     longtext    utf8mb4_general_ci      Yes     NULL    

j3_sv_apptpro3_requests
CREATE TABLE `j3_sv_apptpro3_requests` (
  `id_requests` int(11) NOT NULL,
  `user_id` int(11) DEFAULT NULL,
  `operator_id` int(11) DEFAULT NULL,
  `name` varchar(255) NOT NULL DEFAULT '',
  `phone` varchar(20) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `resource` varchar(50) NOT NULL DEFAULT '',
  `category` varchar(50) NOT NULL DEFAULT '',
  `startdate` date DEFAULT NULL,
  `starttime` time DEFAULT NULL,
  `enddate` date DEFAULT NULL,
  `endtime` time DEFAULT NULL,
  `comment` varchar(255) DEFAULT NULL,
  `admin_comment` varchar(255) DEFAULT NULL,
  `request_status` varchar(20) DEFAULT 'new',
  `payment_status` varchar(20) DEFAULT 'pending',
  `show_on_calendar` char(3) NOT NULL DEFAULT '1',
  `calendar_comment` varchar(200) NOT NULL DEFAULT '',
  `calendar_category` int(11) DEFAULT NULL,
  `calendar_calendar` int(11) DEFAULT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `cancellation_id` varchar(255) DEFAULT NULL,
  `service` varchar(50) DEFAULT NULL,
  `txnid` varchar(255) DEFAULT NULL,
  `sms_reminders` varchar(10) DEFAULT 'No',
  `sms_phone` varchar(50) DEFAULT NULL,
  `sms_dial_code` varchar(4) DEFAULT '1',
  `google_event_id` varchar(255) DEFAULT '',
  `google_calendar_id` varchar(255) DEFAULT '',
  `booking_total` decimal(10,2) DEFAULT '0.00',
  `booking_deposit` decimal(10,2) DEFAULT '0.00',
  `booking_due` decimal(10,2) DEFAULT '0.00',
  `coupon_code` varchar(255) DEFAULT NULL,
  `booked_seats` int(11) DEFAULT '1',
  `booking_language` varchar(25) DEFAULT 'en-gb',
  `credit_used` float(10,2) DEFAULT '0.00',
  `payment_processor_used` varchar(30) DEFAULT 'None',
  `manual_payment_collected` float(10,2) DEFAULT '0.00',
  `last_change_operator` int(11) DEFAULT NULL,
  `invoice_number` varchar(255) DEFAULT '',
  `gift_cert` varchar(255) DEFAULT '',
  `cancel_reason` varchar(255) DEFAULT '',
  `loyalty_points` int(11) DEFAULT '0',
  `checked_out` smallint(5) DEFAULT '0',
  `checked_out_time` datetime DEFAULT NULL,
  `ordering` smallint(5) DEFAULT '0',
  `published` tinyint(3) UNSIGNED DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;


ALTER TABLE `j3_sv_apptpro3_requests`
  ADD PRIMARY KEY (`id_requests`),
  ADD KEY `startdate` (`startdate`);


ALTER TABLE `j3_sv_apptpro3_requests`
  MODIFY `id_requests` int(11) NOT NULL AUTO_INCREMENT;COMMIT;

j3_oncall_calendar_dates
CREATE TABLE `j3_oncall_calendar_dates` (
  `id` int(11) NOT NULL,
  `db_date` date NOT NULL,
  `year` int(11) NOT NULL,
  `month` int(11) NOT NULL,
  `day` int(11) NOT NULL,
  `quarter` int(11) NOT NULL,
  `week` int(11) NOT NULL,
  `day_name` varchar(9) NOT NULL,
  `dayofweek` int(11) NOT NULL,
  `month_name` varchar(9) NOT NULL,
  `holiday_flag` char(1) DEFAULT 'F',
  `saturday_flag` char(1) DEFAULT 'T'
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

ALTER TABLE `j3_oncall_calendar_dates`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `td_ymd_idx` (`year`,`month`,`day`),
  ADD UNIQUE KEY `td_dbdate_idx` (`db_date`);
COMMIT;

最佳答案

尝试过,但没有成功。这就是我结束的地方,现在工作正常。感谢您的建议:

选择 j3_aqi_userdata_v.author, j3_aqi_userdata_v.id 从 j3_aqi_userdata_v 在哪里 j3_aqi_userdata_v.oncall='Y' 和 身份证号码不在 ( 从 j3_sv_apptpro3_requests 选择 user_id 在 j3_oncall_calendar_dates.db_date=j3_sv_apptpro3_requests.startdate 上左加入 j3_oncall_calendar_dates 在哪里 j3_oncall_calendar_dates.saturday_flag = 'T' 和 j3_oncall_calendar_dates.year=年份(当前日期) 和 j3_oncall_calendar_dates.month >= 7 和 ('9','10') 中的 j3_sv_apptpro3_requests.resource )

关于MySQL 双左连接返回与预期结果相反的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43965609/

相关文章:

mysql - 如何根据sql中最近的时间比较2条记录

mysql - phpmyadmin 将 myisam 转换为 innodb

mysql - 使用子查询从不同表中选择计数

MySql Join条件与Where条件获取数据列表

sql - 通过自左连接传递聚合函数列

mysql - 从 mysql 中的 View 调用存储过程。是否可以?如果没有,还有其他选择吗?

php - 在 CakePHP Schema 中设置 sql_mode

java - 不指定用户名和密码的 DB2 连接

database - 使用 Doctrine 2 连接两个表的工作示例

database - 如何在 EclipseLink/JPA 中指定 @OneToMany 的基数