2012-06-12 1 views
1

я следующая таблица с именем [клиентов] с колоннами и следующими значениями:MySql автореферентное запрос

+--------+-----------+--------------+----------------+ 
| 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   | 

мне нужно PHP/MySql запрос который будет список всех городов присутствует в input_value столбец, который находится в состоянии «CA». Очевидно, что общий идентификатор является client_id который всегда является матч, потому что, если клиент находится в тот же client_id 'Лос-Анджелеса также в строке, которая содержит значение «CA» в колонке с input_value. Эта таблица насчитывает более 8 миллионов строк, и высокопроизводительные эквайеры высоко оценены.

Мой мозг жареный, приближающийся крайний срок, не может изменить дизайн стола, нужна помощь, пожалуйста!

+1

Fiddle с приведенной выше таблицей: http://sqlfiddle.com/ #! 2/7ed3f. Вы можете показать инструкцию 'create table' для своей таблицы (чтобы увидеть, как она индексируется)? – biziclop

+2

Итак, вы хотите, чтобы все города калифорнии были для каждого клиента? Я не понимаю. – Sebas

ответ

1
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' 

Примечание: Это может потребоваться некоторые корректировки и, вероятно, может быть оптимизировано. Но это должно заставить вас начать и охлаждать свой мозг.

+1

@Esailija благодарит за изменение. –

+0

Благодарим за быстрый быстрый ответ. Да, это сработает. Однако он не будет возвращать только города. Поскольку оператор SELECT * FROM говорит, что он возвращает всю строку (массив) значений, соответствующих запросу. Но с малой магией массива PHP я получаю то, что мне нужно. – Milan

+0

Просто обновите запрос до: 'SELECT t1.input_value ...' –

0

Я не тестировал этот запрос. Но этот или аналогичный запрос должен работать. Сначала я использовал два подзапроса, чтобы избежать ненужных объединений. Первые фильтры подзапроса для состояния «CA» и второго подзапроса для городов. Если вам нужна таблица для всех городов по их состоянию, удалите предложение «CA» из подзапроса 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 
+0

Хотелось бы, чтобы ваш запрос работал. Я буду держать вас в курсе, если я сделаю это, потому что соединение кажется дорогим, а время задержки составляет почти 2 секунды. :) – Milan

0
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' 

Я бы два индекса ... (Client_Input, Input_Value) и (CLIENT_ID, Client_Input, Input_Value)

Смежные вопросы