MySQL Multiple Search Criteria не возвращает результатов, но работает, если удалить последнюю строку - PullRequest
0 голосов
/ 14 сентября 2011

У меня есть этот запрос к базе данных Mysql: -

SELECT DISTINCT model.model_id, model.model_ref, 
model.manufact_year, model.discontinued_year, model.mini_spec, 
model.equiv_model_id
FROM model 
LEFT JOIN model_custom_field 
ON model_custom_field.model_id = model.model_id
WHERE model.category_id = 140 AND model.manufacturer_id = 1190
AND (model_custom_field.custom_detail_id = 1070 AND model_custom_field.custom_detail_val = '15.6')
AND (model_custom_field.custom_detail_id = 1010 AND model_custom_field.custom_detail_val = 'Dedicated') 

, который возвращает ноль результатов, хотя для поиска имеются действительные данные.

Если я удаляю последнюю строку, она работает.

Там, где у меня есть квадратные скобки в последних двух строках, это потому, что custom_detail_id и custom_detail_val связаны между собой.

Может кто-нибудь подсказать, пожалуйста, правильный ли формат статистики.1011 *

Я знаю, что последние два утверждения противоречат и не могут сработать, но мне нужно знать, есть ли способ объединить последние два, возможно, в союз.

Ответы [ 2 ]

2 голосов
/ 16 сентября 2011

Насколько я понимаю, ваша таблица model_custom_field содержит список различных расширенных атрибутов model, которые реализованы с использованием EAV модель (без каламбура). И вы хотите найти модели, которые имеют два конкретных атрибута с конкретными значениями.

Предполагая, что у одного model_id не может быть дубликатов комбинаций custom_detail_id и custom_detail_val в model_custom_field:

SELECT
  m.model_id,
  m.model_ref,
  m.manufact_year,
  m.discontinued_year,
  m.mini_spec,
  m.equiv_model_id
FROM model m
  INNER JOIN (
    SELECT model_id
    FROM model_custom_field
    WHERE (custom_detail_id = 1070 AND custom_detail_val = '15.6')
       OR (custom_detail_id = 1010 AND custom_detail_val = 'Dedicated')
    GROUP BY model_id
    HAVING COUNT(*) = 2
  ) f ON m.model_id = f.model_id
WHERE m.category_id = 140 
  AND m.manufacturer_id = 1190

Альтернативное решение:

SELECT
  m.model_id,
  m.model_ref,
  m.manufact_year,
  m.discontinued_year,
  m.mini_spec,
  m.equiv_model_id
FROM model m
  INNER JOIN model_custom_field f1070 ON m.model_id = f1070.model_id
  INNER JOIN model_custom_field f1010 ON m.model_id = f1010.model_id
WHERE m.category_id = 140 
  AND m.manufacturer_id = 1190
  AND (f1070.custom_detail_id = 1070 AND f1070.custom_detail_val = '15.6')
  AND (f1010.custom_detail_id = 1010 AND f1010.custom_detail_val = 'Dedicated')
0 голосов
/ 14 сентября 2011

Если я правильно понимаю, что вы пытаетесь сделать, тогда попробуйте это:

SELECT DISTINCT model.model_id, model.model_ref,  model.manufact_year, model.discontinued_year, model.mini_spec,  model.equiv_model_id 
FROM model  
LEFT JOIN model_custom_field  ON model_custom_field.model_id = model.model_id 
WHERE model.category_id = 140 
AND model.manufacturer_id = 1190 
AND ((model_custom_field.custom_detail_id = 1070 AND model_custom_field.custom_detail_val = '15.6') 
or (model_custom_field.custom_detail_id = 1010 AND model_custom_field.custom_detail_val = 'Dedicated'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...