2016-02-04 30 views
0

我有一個複雜的mysql查詢和多重子查詢。我需要其中一個子查詢與主表相關。那是我的查詢:MySQL - 相關的子查詢失敗,where子句中的列是unknwon

SELECT table_cl.id, table_cl.nombre, table_cl.apellidos, (SELECT COUNT(*) FROM (
      SELECT iauno.id_accion, iauno.id_cliente, iauno.asistencia 
      FROM inter_clientes_acciones iauno 
      INNER JOIN clientes clientesuno ON clientesuno.id = iauno.id_cliente 
      WHERE iauno.id_cliente IN(
       SELECT iasubuno.id_cliente 
       FROM inter_clientes_acciones iasubuno 
       INNER JOIN acciones acsubuno ON iasubuno.id_accion = acsubuno.id 
       WHERE acsubuno.id_proyecto = 3 
       GROUP BY iasubuno.id_accion 
       HAVING COUNT(*) = 1 
      ) 
     )caa 
    ) as convocado, 
    (SELECT COUNT(*) FROM (
      SELECT iados.id_accion, iados.id_cliente, iados.asistencia 
      FROM inter_clientes_acciones iados 
      INNER JOIN clientes cldos ON cldos.id = iados.id_cliente 
      WHERE iados.id_cliente IN(
       SELECT iasubdos.id_cliente 
       FROM inter_clientes_acciones iasubdos 
       INNER JOIN acciones acsubdos ON iasubdos.id_accion = acsubdos.id 
       WHERE acsubdos.id_proyecto = 3 AND iasubdos.id_cliente = table_cl.id 
       GROUP BY id_accion 
       HAVING COUNT(*) = 1 
      ) 
     )car 
    ) as realizado 
FROM clientes table_cl 
WHERE table_cl.id_proyecto = 3 AND table_cl.id IN (
    SELECT iatres.id_cliente 
    FROM inter_clientes_acciones iatres 
    INNER JOIN clientes cltres ON cltres.id = iatres.id_cliente 
    WHERE iatres.id_cliente IN(
     SELECT iasubtres.id_cliente 
     FROM inter_clientes_acciones iasubtres 
     INNER JOIN acciones acsubtres ON iasubtres.id_accion = acsubtres.id 
     WHERE acsubtres.id_proyecto = 3 
     GROUP BY iasubtres.id_accion 
     HAVING COUNT(*) = 1 
     ) 
) 

當我執行查詢,我得到的錯誤Error Code: 1054. Unknown column 'table_cl.id' in 'where clause'

我如何修改引用上table_cl的ID查詢?

編輯:

可能的解釋是必需的:我有3個表,客戶行爲和clients_actions(西班牙語說:clientes,acciones和inter_clientes_acciones)。可以爲一個客戶端多個客戶端創建一個動作。這個查詢的目的是獲得這個字段:客戶的名字和姓氏,簽名給客戶的動作數量,以及客戶協助的這些動作的數量,但是隻有分配給他的動作(單個動作)。

在這裏你有一個sql fiddle與模式和失敗的SQL我。

- >編輯2: 我找到了另一種獲取數據的方法。在這種情況下,我將所有操作ID分組在一個字段中,並且(在PHP文件中)我將它計數。我有這樣的迴應:

Individual actions: [ { "nombre": "Susana", "apellidos": "Rodr\u00edguez Torr\u00f3n", "acc_convocadas": "2,3,5", "acc_realizadas": "2" }, { "nombre": "Pablo", "apellidos": "Campos P\u00e9rez", "acc_convocadas": "5", "acc_realizadas": "-" }, { "nombre": "Oscar", "apellidos": "Delacroix", "acc_convocadas": "-", "acc_realizadas": "-" } ] 
Group actions: [ { "nombre": "Susana", "apellidos": "Rodr\u00edguez Torr\u00f3n", "acc_convocadas": "3,1,4", "acc_realizadas": "-" }, { "nombre": "Pablo", "apellidos": "Campos P\u00e9rez", "acc_convocadas": "-", "acc_realizadas": "-" }, { "nombre": "Oscar", "apellidos": "Delacroix", "acc_convocadas": "3", "acc_realizadas": "-" } ] 

這是第

SELECT nombre, apellidos, 
    IFNULL((SELECT GROUP_CONCAT(id_accion) 
    FROM inter_clientes_acciones iac 
    WHERE iac.id_cliente = cl.id AND id_accion IN (
     SELECT iauno.id_accion 
     FROM inter_clientes_acciones iauno 
     INNER JOIN acciones acuno ON iauno.id_accion = acuno.id 
     WHERE acuno.id_proyecto = 3 
     GROUP BY iauno.id_accion 
     HAVING COUNT(*) > 1 
    )), "-") as acc_convocadas, 
    IFNULL((SELECT GROUP_CONCAT(id_accion) 
     FROM inter_clientes_acciones iac 
     WHERE iac.id_cliente = cl.id AND asistencia = 1 AND id_accion IN (
     SELECT iauno.id_accion 
     FROM inter_clientes_acciones iauno 
     INNER JOIN acciones acuno ON iauno.id_accion = acuno.id 
     WHERE acuno.id_proyecto = 3 
     GROUP BY iauno.id_accion 
     HAVING COUNT(*) > 1)), "-") as acc_realizadas 
FROM clientes cl 
WHERE id_proyecto = 3 
+2

如果有人在這裏附近有人幻想選擇這一個,我會感到驚訝(也有點印象深刻)。 – Strawberry

+0

查看我的編輯(我正在寫作) –

+0

我的編輯隨SQL提琴準備就緒 –

回答

0

應該可以從最低級別的子查詢出更高的水平,爲table_cl.id移動檢查(希望)MySQL會識別它。但我有點擔心子查詢如何與id_accion進行分組而無需將其重新組合。使其難以追蹤。

但是,對table_cl.id的檢查位於子查詢的最高級別的最佳猜測。但是,如果沒有表格聲明,不能真正做任何測試。

SELECT table_cl.id, table_cl.nombre, table_cl.apellidos, (SELECT COUNT(*) FROM (
      SELECT iauno.id_accion, iauno.id_cliente, iauno.asistencia 
      FROM inter_clientes_acciones iauno 
      INNER JOIN clientes clientesuno ON clientesuno.id = iauno.id_cliente 
      WHERE iauno.id_cliente IN(
       SELECT iasubuno.id_cliente 
       FROM inter_clientes_acciones iasubuno 
       INNER JOIN acciones acsubuno ON iasubuno.id_accion = acsubuno.id 
       WHERE acsubuno.id_proyecto = 3 
       GROUP BY iasubuno.id_accion 
       HAVING COUNT(*) = 1 
      ) 
     )caa 
    ) as convocado, 
    (
     SELECT COUNT(*) 
     FROM inter_clientes_acciones iados 
     INNER JOIN clientes cldos ON cldos.id = iados.id_cliente 
     INNER JOIN 
     (
      SELECT iasubdos.id_cliente, 
        id_accion 
      FROM inter_clientes_acciones iasubdos 
      INNER JOIN acciones acsubdos ON iasubdos.id_accion = acsubdos.id 
      WHERE acsubdos.id_proyecto = 3 
      GROUP BY iasubdos.id_cliente, id_accion 
      HAVING COUNT(*) = 1 
     ) sub0 ON iados.id_cliente = sub0.id_cliente 
     WHERE iados.id_cliente = table_cl.id 
    ) as realizado 
FROM clientes table_cl 
WHERE table_cl.id_proyecto = 3 AND table_cl.id IN (
    SELECT iatres.id_cliente 
    FROM inter_clientes_acciones iatres 
    INNER JOIN clientes cltres ON cltres.id = iatres.id_cliente 
    WHERE iatres.id_cliente IN(
     SELECT iasubtres.id_cliente 
     FROM inter_clientes_acciones iasubtres 
     INNER JOIN acciones acsubtres ON iasubtres.id_accion = acsubtres.id 
     WHERE acsubtres.id_proyecto = 3 
     GROUP BY iasubtres.id_accion 
     HAVING COUNT(*) = 1 
     ) 
) 

編輯

我已經清理了工作,但不能與您的測試數據進行測試。我也將表格名稱更改爲英文,以便我能夠理解它們!

但它確實執行,我認爲它確實符合你原來的意圖。我認爲這可能會進一步清理它,但我很累,感冒了,而且已經晚了!

SELECT table_cl.id, 
     table_cl.nombre, 
     table_cl.apellidos, 
     (
      SELECT COUNT(*) 
      FROM client_actions 
      INNER JOIN 
      (
       SELECT DISTINCT client_actions.id_cliente 
       FROM client_actions 
       INNER JOIN actions ON client_actions.id_accion = actions.id 
       WHERE actions.id_proyecto = 3 
       GROUP BY client_actions.id_accion 
       HAVING COUNT(*) = 1 
      ) sub1 
      ON client_actions.id_cliente = sub1.id_cliente 
     ) as convocado, 
     (
      SELECT COUNT(*) 
      FROM client_actions 
      INNER JOIN 
      (
       SELECT DISTINCT client_actions.id_cliente 
       FROM client_actions 
       INNER JOIN actions ON client_actions.id_accion = actions.id 
       WHERE actions.id_proyecto = 3 
       GROUP BY id_accion 
       HAVING COUNT(*) = 1 
      ) sub2 
      ON client_actions.id_cliente = sub2.id_cliente 
      WHERE client_actions.id_cliente = table_cl.id 
     ) as realizado 
FROM clients table_cl 
INNER JOIN 
(
    /* Get all the clients who have been the sole client for an action */ 
    SELECT DISTINCT client_actions.id_cliente 
    FROM client_actions 
    INNER JOIN actions ON client_actions.id_accion = actions.id 
    WHERE actions.id_proyecto = 3 
    GROUP BY client_actions.id_accion 
    HAVING COUNT(*) = 1 
) sub0 
ON table_cl.id = sub0.id_cliente 
WHERE table_cl.id_proyecto = 3 
+0

也許一個解釋是必需的:我有3個表格,客戶,行動和clients_actions(用英語說)。可以爲一個客戶或多個客戶創建一個動作。這個查詢的目的是獲得這個字段:客戶的名字和姓氏,簽名給客戶的動作數量,以及客戶協助的這些動作的數量,但是隻有分配給他的動作(單個動作)。我將編輯我的問題以顯示架構, –

+0

我做了我的編輯以向您展示 –