MYSQL 联合和 WHERE 条件

sri*_*r s 3 mysql union where

我无法在 MYSQL 中为 UNION 放置 WHERE 条件。现在使用下面的 SQL 行,我将获取表中的所有记录,而不是在 2 个日期之间过滤日期。

我的订单工作正常。我想在不创建视图的情况下执行此操作

    SELECT *
    FROM DCHDR AS H
    LEFT JOIN DCDTL AS T ON H.DC_No = T.DC_Nos
    UNION
    SELECT *
    FROM DCHDR AS H
    RIGHT JOIN DCDTL AS T ON H.DC_No = T.DC_Nos
    WHERE H.DC_date
    BETWEEN '2013-03-02'
    AND '2013-03-11'
    ORDER BY `Product_Desc` ASC
    LIMIT 510 , 30
Run Code Online (Sandbox Code Playgroud)

lc.*_*lc. 5

与 不同ORDER BYWHERE联合中的子句仅影响联合的那部分(SELECT它所附加的单个查询),而不影响整个联合。

要么将您的联合放在子查询中并过滤结果:

SELECT *
FROM
(
    SELECT *
    FROM DCHDR AS H
    LEFT JOIN DCDTL AS T ON H.DC_No = T.DC_Nos
    UNION
    SELECT *
    FROM DCHDR AS H
    RIGHT JOIN DCDTL AS T ON H.DC_No = T.DC_Nos
) H
WHERE H.DC_date BETWEEN '2013-03-02' AND '2013-03-11'
ORDER BY `Product_Desc` ASC
LIMIT 510, 30
Run Code Online (Sandbox Code Playgroud)

或者为每个部分复制您的条件:

SELECT *
FROM DCHDR AS H
LEFT JOIN DCDTL AS T ON H.DC_No = T.DC_Nos
WHERE H.DC_date BETWEEN '2013-03-02' AND '2013-03-11'
UNION
SELECT *
FROM DCHDR AS H
RIGHT JOIN DCDTL AS T ON H.DC_No = T.DC_Nos
WHERE H.DC_date BETWEEN '2013-03-02' AND '2013-03-11'
ORDER BY `Product_Desc` ASC
LIMIT 510 , 30
Run Code Online (Sandbox Code Playgroud)

看起来您正在尝试模拟完整连接。我可能会建议以下查询,而不是,它应该是快(实际上你想要做什么,这是过滤工会的第二部分):

SELECT *
FROM DCHDR AS H
LEFT JOIN DCDTL AS T ON H.DC_No = T.DC_Nos
WHERE H.DC_date BETWEEN '2013-03-02' AND '2013-03-11'
UNION ALL
SELECT *
FROM DCHDR AS H
RIGHT JOIN DCDTL AS T ON H.DC_No = T.DC_Nos
WHERE H.DC_No IS NULL
ORDER BY `Product_Desc` ASC
LIMIT 510 , 30
Run Code Online (Sandbox Code Playgroud)

请注意,如果您有重复的行,DCDTL因为您有意尝试用 过滤掉UNION,则可以将 更改UNION ALLUNION,但我怀疑实际上并非如此。