Mysql无法在子查询中获取父级的数据

时间:2015-04-16 13:33:31

标签: mysql mariadb

我要进行查询,其中联接可以访问父数据。 我有这个:

SELECT  *
FROM tbl_quart q
    INNER JOIN tbl_poste_horaire ph ON ph.tbl_quart_id = q.id 
    INNER JOIN tbl_poste_horaire_caserne phc ON phc.tbl_poste_horaire_id = ph.id 
    INNER JOIN (
        SELECT DISTINCT q1.id,
        IF(q1.heureDebut>CURTIME(),ADDTIME(q1.heureDebut,'24:00:00'),
               IF(q1.heureFin<CURTIME(),ADDTIME(q1.heureDebut,'48:00:00'),q1.heureDebut)) AS heureTri
        FROM tbl_poste_horaire_caserne phc1 
            INNER JOIN tbl_poste_horaire ph1 ON ph1.id = phc1.tbl_poste_horaire_id 
            INNER JOIN tbl_quart q1 ON q1.id = ph1.tbl_quart_id
        WHERE phc1.tbl_caserne_id = phc.tbl_caserne_id
        ORDER BY phc1.tbl_caserne_id, heureTri
        LIMIT 2
    ) AS quartValide ON quartValide.id = q.id
WHERE phc.tbl_caserne_id IN (1,9)

但是这个请求给了我:

Error Code: 1054
Unknown column 'phc.tbl_caserne_id' in 'where clause'

该行的错误是:

WHERE phc1.tbl_caserne_id = phc.tbl_caserne_id

我也试过这个:

SELECT  *
FROM tbl_quart q
    INNER JOIN tbl_poste_horaire ph ON ph.tbl_quart_id = q.id 
    INNER JOIN tbl_poste_horaire_caserne phc ON phc.tbl_poste_horaire_id = ph.id 
WHERE phc.tbl_caserne_id IN (1,9) AND q.id IN ( SELECT DISTINCT q1.id,
        IF(q1.heureDebut>CURTIME(),ADDTIME(q1.heureDebut,'24:00:00'),
               IF(q1.heureFin<CURTIME(),ADDTIME(q1.heureDebut,'48:00:00'),q1.heureDebut)) AS heureTri
        FROM tbl_poste_horaire_caserne phc1 
            INNER JOIN tbl_poste_horaire ph1 ON ph1.id = phc1.tbl_poste_horaire_id 
            INNER JOIN tbl_quart q1 ON q1.id = ph1.tbl_quart_id
        WHERE phc1.tbl_caserne_id = phc.tbl_caserne_id
        ORDER BY phc1.tbl_caserne_id, heureTri
        LIMIT 2
        )

我也有错误:

Error Code: 1235
This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

尝试这种方式:

SELECT  *
FROM tbl_quart q
    INNER JOIN tbl_poste_horaire ph ON ph.tbl_quart_id = q.id 
    INNER JOIN tbl_poste_horaire_caserne phc ON phc.tbl_poste_horaire_id = ph.id 
    INNER JOIN (
        SELECT DISTINCT q1.id,
        phc1.tbl_caserne_id
        IF(q1.heureDebut>CURTIME(),ADDTIME(q1.heureDebut,'24:00:00'),
               IF(q1.heureFin<CURTIME(),ADDTIME(q1.heureDebut,'48:00:00'),q1.heureDebut)) AS heureTri
        FROM tbl_poste_horaire_caserne phc1 
            INNER JOIN tbl_poste_horaire ph1 ON ph1.id = phc1.tbl_poste_horaire_id 
            INNER JOIN tbl_quart q1 ON q1.id = ph1.tbl_quart_id
        ORDER BY phc1.tbl_caserne_id, heureTri
        LIMIT 2
    ) AS quartValide 
    ON quartValide.id = q.id AND quartValide.tbl_caserne_id = phc.tbl_caserne_id
WHERE phc.tbl_caserne_id IN (1,9)

但重构这个查询会更好......给我一点时间,我想我们可以简化它。

看起来你稍微过度完成了查询。试试这个并告诉我结果有什么问题?

 SELECT DISTINCT q.*,
   ph.*,
   phc.*,
   IF(q.heureDebut>CURTIME(),ADDTIME(q.heureDebut,'24:00:00'),
   IF(q.heureFin<CURTIME(),ADDTIME(q.heureDebut,'48:00:00'),q.heureDebut)) AS heureTri
 FROM tbl_poste_horaire_caserne phc 
 INNER JOIN tbl_poste_horaire ph 
   ON ph.id = phc.tbl_poste_horaire_id 
 INNER JOIN tbl_quart q 
   ON q.id = ph.tbl_quart_id
 WHERE phc.tbl_caserne_id IN (1,9)
 ORDER BY phc.tbl_caserne_id, heureTri
 LIMIT 2