2017-05-14 15 views
0

Ich versuche, zu bestimmen, wer noch nicht auf Abruf auf allen Samstagen im Jahr 2017 zwischen dem 1. Juli und 31. DezemberMySQL Doppel links zurück Gegenteil von den erwarteten Ergebnissen kommen

In MySQL gebucht hat, ich habe zwei Tabellen und 1 Ausblick: j3_aqi_userdata_v (Ansicht) j3_sv_apptpro3_requests (Tabelle) j3_oncall_calendar_dates (Tabelle)

ich brauche eine Liste aller Menschen von j3_aqi_userdata_v zu bekommen, die nicht auftauchen in j3_sv_apptpro3_requests. Ein einfacher linker Join sollte es tun, aber nicht so sehr. Warum kannst du fragen? Nun, ich muss auch einige Aussagen in der WHERE-Klausel hinzufügen, um Tage auszuschließen, die nicht Samstag, Jahre nicht im laufenden Jahr und Monate von Januar bis Juni sind.

ich folgendes haben, aber es ist der Rückkehr nur die Leute, die auf Abruf gebucht haben:

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 

Wer weiß, was ich falsch mache?

Tabellenstrukturen:

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; 
+1

Klingt für mich LINKSES wird ein INNER JOIN umgewandelt, weil JOIN aus der WHERE-Anweisung, um die WHERE-Filter in die Klausel ON bewegen. 'ON (t2.startdate = t3.db_date) UND t3.saturday_flag = 'T' ....' –

Antwort

0

versucht, aber es hat nicht funktioniert. Hier ist, wo ich gelandet bin und es funktioniert jetzt gut. Danke für den Vorschlag:

select j3_aqi_userdata_v.author, j3_aqi_userdata_v.id from j3_aqi_userdata_v where j3_aqi_userdata_v.oncall='Y' and id not IN ( select user_id from j3_sv_apptpro3_requests left join j3_oncall_calendar_dates on j3_oncall_calendar_dates.db_date=j3_sv_apptpro3_requests.startdate where j3_oncall_calendar_dates.saturday_flag = 'T' and j3_oncall_calendar_dates.year=year(current_date) and j3_oncall_calendar_dates.month >= 7 and j3_sv_apptpro3_requests.resource in ('9','10') )

Verwandte Themen