Поиск с функциональностью сводной в MySQL - PullRequest
0 голосов
/ 09 июня 2011

Мне нужно реализовать поиск в таблице MySQL. Он хранит данные в разных строках, поэтому я использовал функцию сводки в MySQL для извлечения данных.
Это работало хорошо, когда мне нужно было искать только одно значение (структура таблицы ниже).

| id | lead_id | form_id | field_number | value   |
===================================================
| 1  |   12    |   12    |    2.3       | John    |
| 2  |   12    |   12    |    4.3       | Dublin  |
| 3  |   13    |   12    |    2.3       | Sam     |
| 4  |   13    |   12    |    4.3       | Cork    |
| 5  |   16    |   14    |    5         | 897894  |
| 16 |   16    |   16    |    7         | test    |
| 17 |   12    |   12    |    4.4       | Ireland |
| 18 |   12    |   12    |    7         | 8899899 |
| 19 |   13    |   12    |    4.4       | USA     |
| 20 |   13    |   12    |    7         | 0909902 |
--------------------------------------------------

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

SELECT lead_id, 
  MAX( IF( ROUND( `field_number` , 1 ) = '2.3', value, 0 ) ) AS "Name", 
  MAX( IF( ROUND( `field_number` , 1 ) = '4.3', value, 0 ) ) AS "City", 
  MAX( IF( ROUND( `field_number` , 1 ) = '4.4', value, 0 ) ) AS "State", 
  MAX( IF( ROUND( `field_number` , 1 ) = '7', value, 0 ) ) AS "SSnumber"
FROM details 
WHERE lead_id IN 
( 
  SELECT DISTINCT lead_id 
  FROM details 
  WHERE 
    (round(`field_number`,1) = '2.3' AND `value` LIKE '%s%') 
    AND form_id = 12 
)
GROUP BY `lead_id`

Теперь мне нужно внедрить фильтр для поиска по городу, штату и пин-коду.
Поэтому мне нужно внести изменения в этот запрос, но я не могу заставить его работать правильно.
Мне нужно добавить условие И для поиска, чтобы фильтровать по городу, штату и пин-коду, что-то вроде этого.

SELECT lead_id, 
  MAX( IF( ROUND( `field_number` , 1 ) = '2.3', value, 0 ) ) AS "Name", 
  MAX( IF( ROUND( `field_number` , 1 ) = '4.3', value, 0 ) ) AS "City", 
  MAX( IF( ROUND( `field_number` , 1 ) = '4.4', value, 0 ) ) AS "State", 
  MAX( IF( ROUND( `field_number` , 1 ) = '7', value, 0 ) ) AS "SSnumber"
FROM details 
WHERE lead_id IN 
(
  SELECT DISTINCT lead_id 
  FROM details 
  WHERE 
  (
    (round(`field_number`,1) = '2.3' AND `value` LIKE '%s%') AND
    (round(`field_number`,1) = '4.3' AND `value` LIKE '%d%') AND
    (round(`field_number`,1) = '4.4' AND `value` LIKE '%r%') AND
  ) 
    AND form_id = 12 
)
GROUP BY `lead_id`

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

1 Ответ

2 голосов
/ 09 июня 2011

Я не полностью понимаю условия, но попробуйте использовать подзапрос. Например -

SELECT * FROM (
  SELECT
    lead_id,
    MAX(IF(ROUND(field_number, 1) = '2.3', value, 0)) AS 'Name',
    MAX(IF(ROUND(field_number, 1) = '4.3', value, 0)) AS 'City',
    MAX(IF(ROUND(field_number, 1) = '4.4', value, 0)) AS 'State',
    MAX(IF(ROUND(field_number, 1) = '7', value, 0)) AS 'SSnumber'
  FROM details
    WHERE form_id = 12
    GROUP BY lead_id
  ) d
WHERE 
  Name LIKE '%s%' AND City LIKE '%d%' AND State LIKE '%r%';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...