Consulta de autorreferencia de MySql

Tengo una siguiente tabla llamada [clientes] con columnas y valores de la siguiente manera:

+--------+-----------+--------------+----------------+
| uid    | client_id | client_input |  input_value   |
+--------+-----------+--------------+----------------+
| 1      |   22      |  City        |  Seattle       |
+--------+-----------+--------------+----------------+
| 2      |   45      |  City        |  Ojai          |
+--------+-----------+--------------+----------------+
| 3      |   22      |  State       |  OR            |
+--------+-----------+--------------+----------------+
| 4      |   45      |  State       |  CA            |
+--------+-----------+--------------+----------------+
| 5      |   65      |  City        |  Orlando       |
+--------+-----------+--------------+----------------+
| 6      |   74      |  State       |  AB            |
+--------+-----------+--------------+----------------+
| 7      |   65      |  State       |  FL            |
+--------+-----------+--------------+----------------+
| 8      |   12      |  City        |  Los Angeles   |
+--------+-----------+--------------+----------------+
| 9      |   12      |  State       |  CA            |

Necesito Consulta PHP/MySql Cuál debería enumerar todas las ciudades Presente en el valor de entrada columna que se encuentran en el estado de 'CA'. Obviamente, el identificador común es el client_id que siempre coincide porque si el cliente está en 'Los Angeles' el mismo client_id también está en la fila que contiene el valor de 'CALIFORNIA' en la valor de entrada columna. Esta tabla tiene más de 8 millones de filas y cualquier equerry de rápido rendimiento es muy apreciado.

Mi cerebro está frito, se acerca la fecha límite, no puedo cambiar el diseño de la mesa, ¡necesito ayuda, por favor!

preguntado el 12 de junio de 12 a las 19:06

Violín con la tabla anterior: sqlfiddle.com/#!2/7ed3f . ¿Puedes mostrar un create table declaración para su tabla (para ver cómo se indexa)? -

Entonces, ¿quieres todas las ciudades de California para cada cliente? no lo entiendo -

3 Respuestas

SELECT *
FROM table AS t1 INNER JOIN table AS t2 ON t1.client_id = t2.client_id
WHERE t1.client_input = 'City' AND t2.client_input = 'State' AND t2.input_value = 'CA'

Nota: Esto puede necesitar algunos ajustes y probablemente podría optimizarse. Pero debería ayudarlo a comenzar y refrescar su cerebro.

Respondido el 12 de junio de 12 a las 19:06

Gracias por la respuesta súper rápida. Sí, esto funcionará. Sin embargo, no devolverá solo las ciudades. Como dice su declaración SELECT * FROM, devuelve la fila completa (matriz) de valores que coinciden con la consulta. Pero con un poco de magia de matriz de PHP estoy obteniendo lo que necesitaba. - Milán

No probé esta consulta. Pero esta o una consulta similar debería funcionar. Primero usé dos subconsultas para evitar uniones innecesarias. La primera subconsulta filtra por el estado 'CA' y la segunda subconsulta por ciudades. Si desea una tabla para todas las ciudades por estado, elimine la cláusula 'CA' de la subconsulta a.

SELECT b.input_value AS city, a.input_value AS state
FROM 
  (SELECT client_id, input_value
   FROM tablename
   WHERE input_value = 'CA'
   AND client_input = 'State')
  AS a,
  (SELECT client_id, input_value
   FROM tablename
   WHERE client_input = 'City')
  AS b
WHERE a.client_id = b.client_id

Respondido el 12 de junio de 12 a las 19:06

Desearía poder hacer que su consulta funcione. Los mantendré informados si lo hago, ya que la unión parece costosa y el tiempo de retraso es de casi 2 segundos, eh :) - Milán

SELECT distinct 
      t2.Input_Value as City
   from
      YourTable t1
         JOIN YourTable t2
            on t1.client_ID = t2.Client_ID
           AND t2.client_input = 'City'
   where
          t1.client_input = 'State'
      AND t1.Input_Value = 'CA'

Tendría dos índices... (Client_Input, Input_Value) y (Client_ID, Client_Input, Input_Value)

Respondido el 12 de junio de 12 a las 19:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.