MYSQL - UNION Второй набор данных не возвращает результаты - PullRequest
0 голосов
/ 05 октября 2018

Итак,

Понятия не имею, что происходит.Оба эти запроса отлично работают самостоятельно.По какой-то причине, хотя, когда я пытаюсь объединить их вместе, я получаю данные только для верхнего запроса.

Я был бы очень признателен за некоторые рекомендации по этому вопросу.Второй запрос в основном возвращает результаты для данных, которые отсутствуют в первом запросе.Я просто не уверен, что происходит.

Вероятно, я не могу понять, что-то простое, но я пробовал довольно много разных вещей, и ничто не помогло.

(SELECT

   date(dg.date) as 'Date',
   (pd.nid) as 'NID',
   if((bl.nid ) is not null,1,0) as 'Blocks',
   pd.special_weekday as 'Weekday Price',
   pd.special_weekend as 'Weekend Price',
   pd.special_weekly as 'Weekly Price',
   pd.special_minstay as 'Minimum Nights'
from (
   select DATE_ADD(curdate(), INTERVAL (@i:=@i+1)-1 DAY) as `Date`
   from information_schema.columns,(SELECT @i:=0) gen_sub 
   where (DATE_ADD(curdate(),INTERVAL @i DAY) BETWEEN curdate() AND date_add(curdate(), INTERVAL 1 DAY)) 
) dg
LEFT JOIN
(SELECT  
n.nid as `nid`,
ifnull(p.special_from,p2.special_from) as `special_from`,
ifnull(p.special_to,p2.special_to) as 'special_to',
ifnull(p.special_weekdayprice,p2.special_weekdayprice) as `special_weekday`,
ifnull(p.special_weekendprice,p2.special_weekendprice) as `special_weekend`,
ifnull(p.special_weeklyprice,p2.special_weeklyprice) as `special_weekly`,
ifnull(p.special_minstay,p2.special_minstay) as `special_minstay`,
n.state_name as `state_name`

FROM 
radb.property_state_machine n 
LEFT JOIN radb.rep_property rep on n.nid=rep.parent
LEFT JOIN radb.rep_property rep1 on n.nid=rep1.nid
LEFT JOIN radb.price_dates p on n.nid=p.nid 
LEFT JOIN radb.price_dates p2 on rep1.parent=p2.nid 
WHERE n.state_name='Live' AND ( (rep.nid = 0 OR isnull(rep.nid)))) pd on ((pd.special_to IS NULL OR date(pd.special_to) >= dg.date)) AND (date(pd.special_from) <= dg.date )
LEFT JOIN
radb.node n on pd.nid=n.nid
LEFT JOIN
radb.profile_value pv on n.uid=pv.uid
LEFT JOIN
radb.admin_book bl  on ((date(bl.book_end) IS NULL OR date(bl.book_end) >= dg.date) and pd.nid=bl.nid) AND (date(bl.book_start) <= dg.date AND pd.nid=bl.nid)



GROUP BY 1,2)

UNION ALL



(SELECT

   date(dt.date) as 'Date',
    (tm.nid) as 'NID',
   if((tm.nid) is not null,1,0) as 'Blocks',
   null,
   null,
   null,
   null

FROM (
   select DATE_ADD(curdate(), INTERVAL (@i:=@i+1)-1 DAY) as `Date`
   from information_schema.columns,(SELECT @i:=0) gen_sub 
   where (DATE_ADD(curdate(),INTERVAL @i DAY) BETWEEN curdate() AND date_add(curdate(), INTERVAL 1 DAY)) 
) dt
LEFT JOIN
(SELECT  
n1.nid as `nid`,
ifnull(m.book_start,m2.book_start) as `book_start`,
ifnull(m.book_end,m2.book_end) as `book_end`,
n1.state_name as `state_name`

FROM 
radb.property_state_machine n1
LEFT JOIN radb.rep_property rp on n1.nid=rp.parent
LEFT JOIN radb.rep_property rp1 on n1.nid=rp1.nid
LEFT JOIN radb.admin_book_temp m on n1.nid=m.nid 
LEFT JOIN radb.admin_book_temp m2 on rp1.parent=m2.nid 
WHERE n1.state_name='Live' AND ( (rp.nid = 0 OR isnull(rp.nid)))) tm  on ((date(tm.book_end) IS NULL OR date(tm.book_end) >= dt.date)  ) AND (date(tm.book_start) <= dt.date  ) 
LEFT JOIN
radb.node n2 on tm.nid=n2.nid
LEFT JOIN
radb.profile_value pv on n2.uid=pv.uid




GROUP BY 1,2)

ВЕРСИЯ 2 - Все та же проблема, даже когда я поместил UNION в подвыбор

SELECT
 x.date as 'Date',
 x.NID as 'NID',
 x.blocks as 'Blocks',
 x.weekday as 'Weekday',
 x.weekend as 'Weekend',
 x.weekly as 'Weekly',
 x.min as 'Nights'
 FROM
   (SELECT date(dg.date) as 'Date',
   (pd.nid) as 'NID',
   if((bl.nid ) is not null,1,0) as 'Blocks',
   pd.special_weekday as 'Weekday',
   pd.special_weekend as 'Weekend',
   pd.special_weekly as 'Weekly',
   pd.special_minstay as 'min'
from (
   select DATE_ADD(curdate(), INTERVAL (@i:=@i+1)-1 DAY) as `Date`
   from information_schema.columns,(SELECT @i:=0) gen_sub 
   where (DATE_ADD(curdate(),INTERVAL @i DAY) BETWEEN curdate() AND date_add(curdate(), INTERVAL 1 DAY)) 
) dg
LEFT JOIN
(SELECT  
n.nid as `nid`,
ifnull(p.special_from,p2.special_from) as `special_from`,
ifnull(p.special_to,p2.special_to) as 'special_to',
ifnull(p.special_weekdayprice,p2.special_weekdayprice) as `special_weekday`,
ifnull(p.special_weekendprice,p2.special_weekendprice) as `special_weekend`,
ifnull(p.special_weeklyprice,p2.special_weeklyprice) as `special_weekly`,
ifnull(p.special_minstay,p2.special_minstay) as `special_minstay`,
n.state_name as `state_name`

FROM 
radb.property_state_machine n 
LEFT JOIN radb.rep_property rep on n.nid=rep.parent
LEFT JOIN radb.rep_property rep1 on n.nid=rep1.nid
LEFT JOIN radb.price_dates p on n.nid=p.nid 
LEFT JOIN radb.price_dates p2 on rep1.parent=p2.nid 
WHERE n.state_name='Live' AND ( (rep.nid = 0 OR isnull(rep.nid)))) pd on ((pd.special_to IS NULL OR date(pd.special_to) >= dg.date)) AND (date(pd.special_from) <= dg.date )
LEFT JOIN
radb.admin_book bl  on ((date(bl.book_end) IS NULL OR date(bl.book_end) >= dg.date) and pd.nid=bl.nid) AND (date(bl.book_start) <= dg.date AND pd.nid=bl.nid)





UNION ALL
SELECT

   date(dt.date) as 'Date',
    (tm.nid) as 'NID',
   if((tm.nid) is not null,1,0) as 'Blocks',
   null as'Weekday',
   null as 'Weekend',
   null as 'Weekly',
   null as 'Nights'

FROM (
   select DATE_ADD(curdate(), INTERVAL (@i:=@i+1)-1 DAY) as `Date`
   from information_schema.columns,(SELECT @i:=0) gen_sub 
   where (DATE_ADD(curdate(),INTERVAL @i DAY) BETWEEN curdate() AND date_add(curdate(), INTERVAL 1 DAY)) 
) dt
LEFT JOIN
(SELECT  
n.nid as `nid`,
ifnull(p.book_start,p2.book_start) as `book_start`,
ifnull(p.book_end,p2.book_end) as `book_end`,
n.state_name as `state_name`

FROM 
radb.property_state_machine n 
LEFT JOIN radb.rep_property rep on n.nid=rep.parent
LEFT JOIN radb.rep_property rep1 on n.nid=rep1.nid
LEFT JOIN radb.admin_book_temp p on n.nid=p.nid 
LEFT JOIN radb.admin_book_temp p2 on rep1.parent=p2.nid 
WHERE n.state_name='Live' AND ( (rep.nid = 0 OR isnull(rep.nid)))) tm  on ((date(tm.book_end) IS NULL OR date(tm.book_end) >= dt.date)  ) AND (date(tm.book_start) <= dt.date  ) 


 ) x
LEFT JOIN
radb.node n on x.nid=n.nid
LEFT JOIN
radb.profile_value pv on n.uid=pv.uid

GROUP BY x.date,x.nid,x.blocks,x.weekday,x.weekend,x.weekly,x.min

РЕЗУЛЬТАТЫ ОБРАЗЦА

DATA SET #1

# Date, NID, Blocks, Weekday Price, Weekend Price, Weekly Price, Minimum Nights
'2018-10-05', '190668', '1', '165', '165', '165', '3'
'2018-10-05', '190669', '1', '235', '235', '231', '2'
'2018-10-05', '190671', '0', '176', '133', '142', '2'
'2018-10-05', '190672', '1', '661', '661', '658', '4'
'2018-10-05', '190673', '1', '203', '203', '138', '2'
'2018-10-05', '190675', '1', '219', '219', '158', '4'
'2018-10-05', '190676', '1', '204', '204', '197', '3'
'2018-10-05', '190677', '1', '235', '235', '217', '3'


DATA SET #2

# Date, NID, Blocks, Weekday Price, Weekend Price, Weekly Price, Minimum Nights
'2018-10-05', '190670', '1', NULL, NULL, NULL, NULL
'2018-10-06', '190670', '1', NULL, NULL, NULL, NULL
'2018-10-05', '190680', '1', NULL, NULL, NULL, NULL
'2018-10-05', '190885', '1', NULL, NULL, NULL, NULL
'2018-10-06', '190885', '1', NULL, NULL, NULL, NULL
'2018-10-05', '190933', '1', NULL, NULL, NULL, NULL
'2018-10-05', '191063', '1', NULL, NULL, NULL, NULL
'2018-10-06', '191063', '1', NULL, NULL, NULL, NULL

По сути, эти два набора данных должны быть добавлены каквторой набор данных заполняет пропуски набора данных 1. Второй набор данных не будет иметь данных для последних 4 столбцов.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Итак,

После нескольких размышлений над этой логикой и проб и ошибок я понял, что она не может объединиться из-за моего сгенерированного подзапроса даты.Из-за этого я переделал логику, по которой выполнялся запрос.

Ниже приведен мой рабочий SQL.Спасибо всем за помощь.

SELECT 
b.nid as 'NID',
dg.date as 'Date',
if((bl.nid is not null) or isnull(b.weekday), 1,0) as 'Blocks',
b.weekday as 'Weekday',
b.weekend as 'Weekend',
b.weekly as 'Weekly',
b.nights as 'Nights'
as 'Nights'

FROM
(
   select DATE_ADD(curdate(), INTERVAL (@i:=@i+1)-1 DAY) as `Date`
   from information_schema.columns,(SELECT @i:=0) gen_sub 
   where (DATE_ADD(curdate(),INTERVAL @i DAY) BETWEEN curdate() AND date_add(curdate(), INTERVAL 1 DAY)) 
) dg
LEFT JOIN
(SELECT


   (pd.nid) as 'NID',
   pd.special_from as 'start',
   pd.special_to as 'end',
   pd.special_weekday as 'Weekday',
   pd.special_weekend as 'Weekend',
   pd.special_weekly as 'Weekly',
   pd.special_minstay as 'Nights'
from 

(SELECT  
n.nid as `nid`,
ifnull(p.special_from,p2.special_from) as `special_from`,
ifnull(p.special_to,p2.special_to) as 'special_to',
ifnull(p.special_weekdayprice,p2.special_weekdayprice) as `special_weekday`,
ifnull(p.special_weekendprice,p2.special_weekendprice) as `special_weekend`,
ifnull(p.special_weeklyprice,p2.special_weeklyprice) as `special_weekly`,
ifnull(p.special_minstay,p2.special_minstay) as `special_minstay`,
n.state_name as `state_name`

FROM 
radb.property_state_machine n 
LEFT JOIN radb.rep_property rep on n.nid=rep.parent
LEFT JOIN radb.rep_property rep1 on n.nid=rep1.nid
LEFT JOIN radb.price_dates p on n.nid=p.nid 
LEFT JOIN radb.price_dates p2 on rep1.parent=p2.nid 
WHERE ( (rep.nid = 0 OR isnull(rep.nid)))) pd 





UNION ALL



SELECT


    (tm.nid) as 'NID',
    tm.book_start as 'start',
    tm.book_end as 'end',
   null,
   null,
   null,
   null

FROM 
(SELECT 
nd2.nid as 'nid',
ifnull(t.book_start,t2.book_start) as `book_start`,
ifnull(t.book_end,t2.book_end) as `book_end`
FROM radb.property_state_machine nd2
LEFT JOIN radb.rep_property rp on nd2.nid=rp.parent
LEFT JOIN radb.rep_property rp1 on nd2.nid=rp1.nid
LEFT JOIN radb.admin_book_temp t on nd2.nid=t.nid 
LEFT JOIN radb.admin_book_temp t2 on rp1.parent=t2.nid where ((rp.nid = 0 OR isnull(rp.nid)))
 ) tm  



) b on ((b.end IS NULL OR date(b.end) >= dg.date)) AND (date(b.start) <= dg.date )
LEFT JOIN
radb.admin_book bl on ((date(bl.book_end) IS NULL OR date(bl.book_end) >= dg.date) and bl.nid=b.nid) AND (date(bl.book_start) <= dg.date AND bl.nid=b.nid)
LEFT JOIN
radb.property_state_machine psm on b.nid=psm.nid

where psm.state_name='Live'

GROUP BY 1,2
FROM
(
   select DATE_ADD(curdate(), INTERVAL (@i:=@i+1)-1 DAY) as `Date`
   from information_schema.columns,(SELECT @i:=0) gen_sub 
   where (DATE_ADD(curdate(),INTERVAL @i DAY) BETWEEN curdate() AND date_add(curdate(), INTERVAL 1 DAY)) 
) dg
LEFT JOIN
(SELECT


   (pd.nid) as 'NID',
   pd.special_from as 'start',
   pd.special_to as 'end',
   pd.special_weekday as 'Weekday',
   pd.special_weekend as 'Weekend',
   pd.special_weekly as 'Weekly',
   pd.special_minstay as 'Nights'
from 

(SELECT  
n.nid as `nid`,
ifnull(p.special_from,p2.special_from) as `special_from`,
ifnull(p.special_to,p2.special_to) as 'special_to',
ifnull(p.special_weekdayprice,p2.special_weekdayprice) as `special_weekday`,
ifnull(p.special_weekendprice,p2.special_weekendprice) as `special_weekend`,
ifnull(p.special_weeklyprice,p2.special_weeklyprice) as `special_weekly`,
ifnull(p.special_minstay,p2.special_minstay) as `special_minstay`,
n.state_name as `state_name`

FROM 
radb.property_state_machine n 
LEFT JOIN radb.rep_property rep on n.nid=rep.parent
LEFT JOIN radb.rep_property rep1 on n.nid=rep1.nid
LEFT JOIN radb.price_dates p on n.nid=p.nid 
LEFT JOIN radb.price_dates p2 on rep1.parent=p2.nid 
WHERE ( (rep.nid = 0 OR isnull(rep.nid)))) pd 





UNION ALL



SELECT


    (tm.nid) as 'NID',
    tm.book_start as 'start',
    tm.book_end as 'end',
   null,
   null,
   null,
   null

FROM 
(SELECT 
nd2.nid as 'nid',
ifnull(t.book_start,t2.book_start) as `book_start`,
ifnull(t.book_end,t2.book_end) as `book_end`
FROM radb.property_state_machine nd2
LEFT JOIN radb.rep_property rp on nd2.nid=rp.parent
LEFT JOIN radb.rep_property rp1 on nd2.nid=rp1.nid
LEFT JOIN radb.admin_book_temp t on nd2.nid=t.nid 
LEFT JOIN radb.admin_book_temp t2 on rp1.parent=t2.nid where ((rp.nid = 0 OR isnull(rp.nid)))
 ) tm  



) b on ((b.end IS NULL OR date(b.end) >= dg.date)) AND (date(b.start) <= dg.date )
LEFT JOIN
radb.admin_book bl on ((date(bl.book_end) IS NULL OR date(bl.book_end) >= dg.date) and bl.nid=b.nid) AND (date(bl.book_start) <= dg.date AND bl.nid=b.nid)
LEFT JOIN
radb.property_state_machine psm on b.nid=psm.nid

where psm.state_name='Live'

GROUP BY 1,2
0 голосов
/ 05 октября 2018

Попробуйте это.Я думаю, вы должны иметь одинаковые имена столбцов в обеих таблицах.

(SELECT

   date(dg.date) as 'Date',
   (pd.nid) as 'NID',
   if((bl.nid ) is not null,1,0) as 'Blocks',
   pd.special_weekday as 'Weekday Price',
   pd.special_weekend as 'Weekend Price',
   pd.special_weekly as 'Weekly Price',
   pd.special_minstay as 'Minimum Nights'
from (
   select DATE_ADD(curdate(), INTERVAL (@i:=@i+1)-1 DAY) as `Date`
   from information_schema.columns,(SELECT @i:=0) gen_sub 
   where (DATE_ADD(curdate(),INTERVAL @i DAY) BETWEEN curdate() AND date_add(curdate(), INTERVAL 1 DAY)) 
) dg
LEFT JOIN
(SELECT  
n.nid as `nid`,
ifnull(p.special_from,p2.special_from) as `special_from`,
ifnull(p.special_to,p2.special_to) as 'special_to',
ifnull(p.special_weekdayprice,p2.special_weekdayprice) as `special_weekday`,
ifnull(p.special_weekendprice,p2.special_weekendprice) as `special_weekend`,
ifnull(p.special_weeklyprice,p2.special_weeklyprice) as `special_weekly`,
ifnull(p.special_minstay,p2.special_minstay) as `special_minstay`,
n.state_name as `state_name`

FROM 
radb.property_state_machine n 
LEFT JOIN radb.rep_property rep on n.nid=rep.parent
LEFT JOIN radb.rep_property rep1 on n.nid=rep1.nid
LEFT JOIN radb.price_dates p on n.nid=p.nid 
LEFT JOIN radb.price_dates p2 on rep1.parent=p2.nid 
WHERE n.state_name='Live' AND ( (rep.nid = 0 OR isnull(rep.nid)))) pd on ((pd.special_to IS NULL OR date(pd.special_to) >= dg.date)) AND (date(pd.special_from) <= dg.date )
LEFT JOIN
radb.node n on pd.nid=n.nid
LEFT JOIN
radb.profile_value pv on n.uid=pv.uid
LEFT JOIN
radb.admin_book bl  on ((date(bl.book_end) IS NULL OR date(bl.book_end) >= dg.date) and pd.nid=bl.nid) AND (date(bl.book_start) <= dg.date AND pd.nid=bl.nid)



GROUP BY 1,2)

UNION ALL



(SELECT

   date(dt.date) as 'Date',
    (tm.nid) as 'NID',
   if((tm.nid) is not null,1,0) as 'Blocks',
   null as 'Weekday Price',
   null as 'Weekend Price',
   null as 'Weekly Price',
   null as 'Minimum Nights'

FROM (
   select DATE_ADD(curdate(), INTERVAL (@i:=@i+1)-1 DAY) as `Date`
   from information_schema.columns,(SELECT @i:=0) gen_sub 
   where (DATE_ADD(curdate(),INTERVAL @i DAY) BETWEEN curdate() AND date_add(curdate(), INTERVAL 1 DAY)) 
) dt
LEFT JOIN
(SELECT  
n1.nid as `nid`,
ifnull(m.book_start,m2.book_start) as `book_start`,
ifnull(m.book_end,m2.book_end) as `book_end`,
n1.state_name as `state_name`

FROM 
radb.property_state_machine n1
LEFT JOIN radb.rep_property rp on n1.nid=rp.parent
LEFT JOIN radb.rep_property rp1 on n1.nid=rp1.nid
LEFT JOIN radb.admin_book_temp m on n1.nid=m.nid 
LEFT JOIN radb.admin_book_temp m2 on rp1.parent=m2.nid 
WHERE n1.state_name='Live' AND ( (rp.nid = 0 OR isnull(rp.nid)))) tm  on ((date(tm.book_end) IS NULL OR date(tm.book_end) >= dt.date)  ) AND (date(tm.book_start) <= dt.date  ) 
LEFT JOIN
radb.node n2 on tm.nid=n2.nid
LEFT JOIN
radb.profile_value pv on n2.uid=pv.uid




GROUP BY 1,2)
...