繁体   English   中英

mysql - 如何将主查询值传递给子查询中的连接

[英]mysql - How to pass main query value into a join in subquery

我有以下查询(嗯...让我烦恼的部分):

SELECT DISTINCT `serv`.`id`, `serv`.`name`, `prj`.`id` AS `idProject`, `prj`.`name` AS `projectName`, `units`.`id` AS `idUnit`,
    `units`.`name` AS `unitName`, `units`.`description` AS `unitDescription`, `units`.`descriptionLong` AS `unitLongDescription`,
    `units`.`address`, `units`.`telephone`, (
        SELECT DISTINCT GROUP_CONCAT(CONCAT(`subserv`.`id`, '|', `subserv`.`name`, '|', `links`.`continuous`))
        FROM `" . DBT_SERV . "` AS `subserv`
        JOIN `" . DBT_SERV_LINKS . "` AS `links` ON (
            `links`.`deleted` = 0 AND
            `links`.`idProject` = `serv`.`idProject` AND
            `links`.`mandatory` = '1' AND
            `links`.`subserviceLink` = 1 AND
            `links`.`serviceFrom` LIKE CONCAT ('|', `serv`.`id`,'|') AND
            `links`.`serviceTo` LIKE CONCAT('|', `subserv`.`id`, '|')
        )
        WHERE `idParentService` = `serv`.`id`
            AND `subserv`.`deleted` = 0
            AND `subserv`.`onSaleStatus` = 'onSale'
            AND `subserv`.`serviceGroup` = 'SS'
    ) AS `subservices`, (
        SELECT `file`
        FROM `" . DBT_GALLERY . "` AS `gallery`
        WHERE `gallery`.`category` = 'accommodationUnit'
            AND `idObject` = `idUnit`
        LIMIT 1
    ) AS `picture`
FROM `" . DBT_SERV . "` AS `serv`

ETC.,ETC ......一些更多的联合和一个地方。

我的问题是我收到以下错误:#1054 - 'on子句'中的未知列'serv.idProject'

如果我删除links idProject = serv idProject我得到#1054 - 'on子句'中的未知列'serv.id ='。

基本上......我在ON子句中看不到serv任何内容。 如果我删除整个JOIN查询工作,那么在WHERE子句中serv是可见的。 知道如何让它在ON子句中工作吗?

在内部选择中,您只加入subservlinks ,因此您不能在ON使用其他表。 您应该能够在WHERE子句中访问外部表,但是:

... (
SELECT DISTINCT GROUP_CONCAT(CONCAT(`subserv`.`id`, '|', `subserv`.`name`, '|', `links`.`continuous`))
                FROM `" . DBT_SERV . "` AS `subserv`
                JOIN `" . DBT_SERV_LINKS . "` AS `links` ON (
                    `links`.`deleted` = 0 AND
                    `links`.`mandatory` = '1' AND
                    `links`.`subserviceLink` = 1 AND
                    `links`.`serviceTo` LIKE CONCAT('|', `subserv`.`id`, '|')
                WHERE `links`.`idProject` = `serv`.`idProject` AND
                      `links`.`serviceFrom` LIKE CONCAT ('|', `serv`.`id`,'|') 
                )
...

应该适用于内部子选择。

尝试这个

SELECT DISTINCT `serv`.`SID`, `serv`.`SNAME`, `serv`.`SIDP`, `prj`.`id` AS `idProject`,
`prj`.`name` AS `projectName`, `units`.`id` AS `idUnit`,
`units`.`name` AS `unitName`, `units`.`description` AS `unitDescription`,
`units`.`descriptionLong` AS `unitLongDescription`, `units`.`address`, 
`units`.`telephone`,
    (
        SELECT DISTINCT GROUP_CONCAT(CONCAT(`subserv`.`id`, '|', `subserv`.`name`, '|', `links`.`continuous`))
        FROM `" . DBT_SERV . "` AS `subserv`
        JOIN `" . DBT_SERV_LINKS . "` AS `links` ON (
            `links`.`deleted` = 0 AND
            `links`.`idProject` = `serv`.`SIDP` AND
            `links`.`mandatory` = '1' AND
            `links`.`subserviceLink` = 1 AND
            `links`.`serviceFrom` LIKE CONCAT ('|', `serv`.`SID`,'|') AND
            `links`.`serviceTo` LIKE CONCAT('|', `subserv`.`id`, '|')
        )
        WHERE `idParentService` = `serv`.`SID`
            AND `subserv`.`deleted` = 0
            AND `subserv`.`onSaleStatus` = 'onSale'
            AND `subserv`.`serviceGroup` = 'SS'
    ) AS `subservices`, (
        SELECT `file`
        FROM `" . DBT_GALLERY . "` AS `gallery`
        WHERE `gallery`.`category` = 'accommodationUnit'
            AND `idObject` = `idUnit`
        LIMIT 1
    ) AS `picture`
FROM 
    (SELECT `id` AS `SID`, `idProject` AS `SIDP`, `name` AS `SNAME` FROM `" . DBT_SERV . "`) AS serv
ETC., ETC... some more joins and a where.

SID,SNAME和SIDP别名在主体查询中定义,因此它应该可以访问subquerys。

使用此http://sourceforge.net/projects/sqleo/来帮助您进行复杂的查询!

在子查询编译期间,别名(serv)不存在,因为在子查询被认为有效且其输出已知之前,无法编译外部查询。

因此,快速解决方案就是在子查询中用DBT_SERV替换serv。

SELECT DISTINCT `serv`.`id`, `serv`.`name`, `prj`.`id` AS `idProject`, `prj`.`name` AS `projectName`, `units`.`id` AS `idUnit`,
    `units`.`name` AS `unitName`, `units`.`description` AS `unitDescription`, `units`.`descriptionLong` AS `unitLongDescription`,
    `units`.`address`, `units`.`telephone`, (
        SELECT DISTINCT GROUP_CONCAT(CONCAT(`subserv`.`id`, '|', `subserv`.`name`, '|', `links`.`continuous`))
        FROM `" . DBT_SERV . "` AS `subserv`
        JOIN `" . DBT_SERV_LINKS . "` AS `links` ON (
            `links`.`deleted` = 0 AND
            `links`.`idProject` = `" . DBT_SERV . "`.`idProject` AND
            `links`.`mandatory` = '1' AND
            `links`.`subserviceLink` = 1 AND
            `links`.`serviceFrom` LIKE CONCAT ('|', `" . DBT_SERV . "`.`id`,'|') AND
            `links`.`serviceTo` LIKE CONCAT('|', `subserv`.`id`, '|')
        )
        WHERE `idParentService` = `" . DBT_SERV . "`.`id`
            AND `subserv`.`deleted` = 0
            AND `subserv`.`onSaleStatus` = 'onSale'
            AND `subserv`.`serviceGroup` = 'SS'
    ) AS `subservices`, (
        SELECT `file`
        FROM `" . DBT_GALLERY . "` AS `gallery`
        WHERE `gallery`.`category` = 'accommodationUnit'
            AND `idObject` = `idUnit`
        LIMIT 1
    ) AS `picture`
FROM `" . DBT_SERV . "` AS `serv`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM