具有联接表和派生表的MySQL查询

时间:2019-06-16 19:05:06

标签: php sql mysqli

我正在尝试将行计数添加到现有查询中,但出现错误

“ on子句”中的未知列“ pl.GroupNumber”

我显然也会回答这个问题,以防它对其他人有帮助,因为在这里写下所有这些之后,我想到将FROM改为:

* FROM(SELECT @row_number:= 0)AS t,parts_listing pl *

这似乎可以解决问题!不太了解它为什么起作用,但确实起作用。

SELECT DISTINCT 
    (@row_number:=@row_number + 1) AS RowNum,
    pl.ID,
    pn.ID AS SubID,
    IF(ListType,(SELECT MAX(ID) FROM parts_notes
    WHERE PageNo=429
        AND ListType IS NOT NULL AND SubPage IS NULL AND
        (BasePart IS NOT NULL AND Models IS NOT NULL
        AND (BasePart=pl.PartNo
        AND pl.Models LIKE CONCAT('%', Models ,'%')))
        OR  (BasePart IS NOT NULL AND Models IS NULL
        AND BasePart=pl.PartNo) ),NULL) AS SubMax,
    ListType,
    IndentText,
    BaseGroup,
    BaseName,
    GroupName,
    Title,
    `Name`,
    pl.Models,
    pl.PartNo,
    pn.PartNo AS SubPartNo,
    pl.Quantity,
    pn.Quantity AS SubQuantity,
    pn.Description AS SubDescription,
    ListType,
    Column_1,
    Column_2,
    Column_3,
    Column_4,
    Column_5,
    Column_6,
    Column_7,
    Column_8,
    COALESCE(pl.GroupNumber, pn.GroupNo) AS GroupNo,
    COALESCE(pl.Description, pn.Description) AS Description,
    COALESCE(pl.PageNo, pn.PageNo) AS PageNo,
    COALESCE(pl.SubPage, pn.SubPage) AS SubPage,
    COALESCE(pl.RevDate, pn.RevDate) AS RevDate,
    COALESCE(pl.Edition, pn.Edition) AS Edition
    FROM parts_listing pl, (SELECT @row_number:=0) AS t 
    LEFT JOIN parts_notes pn ON pl.GroupNumber=pn.GroupNo
    AND ((ListType < 5 AND (pl.PartNo=BasePart AND BasePart IS NOT NULL) OR BasePart IS NULL)
    OR ((ListType > 4) AND (pl.GroupNumber=pn.GroupNo OR pl.PartNo=BasePart)))
WHERE BaseGroup=30 AND pl.PageNo=429 AND (pl.SubPage IS NULL
    AND pn.SubPage IS NULL)
    AND (pl.PageNo = pn.PageNo OR pn.PageNo IS NULL)
    AND (pl.SubPage = pn.SubPage OR pn.SubPage IS NULL) 
ORDER BY pl.ID, pn.ID 
LIMIT 150;

1 个答案:

答案 0 :(得分:1)

即使打算使用FROM,也不要在CROSS JOIN子句中使用逗号。作用域规则不是您所期望的,这就是为什么您看到未知列的原因。

我将参数条件放在最后,所以我将其写为:

FROM parts_listing pl LEFT JOIN 
     parts_notes pn 
     ON pl.GroupNumber = pn.GroupNo AND
        ((ListType < 5 AND
         (pl.PartNo = BasePart AND BasePart IS NOT NULL
         ) OR BasePart IS NULL
        ) OR
        ((ListType > 4) AND
         (pl.GroupNumber = pn.GroupNo OR pl.PartNo = BasePart)
         )
        ) CROSS JOIN
     (SELECT @row_number := 0) params
相关问题