2013-07-27 3 views
1

У меня есть таблица «model_values», который выглядит следующим образом:Как выполнить запрос mysql, ограниченный значением в той же таблице?

+----+------------+-------------+----------------+------------+ 
| id | value_post | value_model | value_property | value_data | 
+----+------------+-------------+----------------+------------+ 
| 1 |   1 |   39 |    1 | ValueA  | 
| 2 |   1 |   39 |    2 | Value1  | 
| 3 |   1 |   39 |    3 | 2013  | 
| 4 |   2 |   39 |    1 | ValueA  | 
| 5 |   2 |   39 |    2 | Value2  | 
| 6 |   2 |   39 |    3 | 2012  | 
| 7 |   3 |   39 |    1 | ValueB  | 
| 8 |   3 |   39 |    2 | Value1  | 
| 9 |   3 |   39 |    3 | 2013  | 
| 10 |   4 |   30 |    1 | ValueA  | 
| 11 |   4 |   30 |    2 | Value2  | 
| 12 |   4 |   30 |    3 | 2013  | 
+----+------------+-------------+----------------+------------+ 

Я пытаюсь создать набор раскрывающихся, которые показывают value_data для value_property-х 1 и 2, основываясь на следующем запросе:

SELECT * 
FROM model_values 
INNER JOIN models 
ON model_values.value_model = models.id 
INNER JOIN properties 
ON model_values.value_property = properties.id 
WHERE model_values.value_property = {$safe_property} && models.id = {$safe_model_id} 
GROUP BY model_values.value_data 

Но я хочу, чтобы выпадающие списки также ограничивались значением_property 3 (который является годом). Таким образом, пользователь будет первым выбрать год 2013, а затем получить две капли спады, чтобы выбрать из со следующими параметрами:

Select 1: ValueA/ValueB 
Select 2: Value1 

Или, если они выбрали 2012 первое, что они увидели бы:

Select 1: ValueA 
Select 2: Value2 

Я пытался придумать запросы, как:

WHERE model_values.value_property = 1 && models.id = 39 && model_values.value_data = 2013 

Но очевидно, что не работает, так как value_property 1 никогда не будет value_data в 2013 году

Или подзапросов нравится:

WHERE model_values.value_property = 1 && models.id = 39 && model_values.value_data = (
    SELECT model_values.value_data 
    FROM model_values 
    WHERE model_values.value_data = 2013 
) 

Но что возвращает более чем на 1 строку.

Возможно ли такое требование?

+0

Как выглядит желаемый результат? - и предоставите sqlfiddle для вышеуказанного – Strawberry

+0

Вот ссылка на sqlfiddle: http://sqlfiddle.com/#!2/d3f3b6/2 Результат будет выглядеть так, как в ссылке, но запрос будет включать ограничение это до 2012 года, поэтому «Value1» не должен отображаться. Я только достаточно знаю о mysql, чтобы попасть в неприятности на этом этапе. Я предполагаю, что если я не могу заставить этот запрос работать, мне придется вернуться и посмотреть, как я перебираю результаты в своем php. – ryansommers

+0

То, что я собираю, это невозможно с помощью только mysql. Я скорректировал свой PHP, чтобы пройти по другому, чтобы получить результат, который я искал. Не уверен, закрываю или удаляю этот вопрос сейчас? – ryansommers

ответ

0

Следующий запрос возвращает промежуточный результат, который напрашивается два вопроса:

1 Как мы знаем, какой результат принадлежит к какому году?

2 Предполагая, что мы хотели value_data = 2, какие критерии при выборе id 5 вместо id 8?

SELECT * 
    FROM model_values 
    WHERE value_property = 2 
    AND value_model = 39; 

ID VALUE_POST VALUE_MODEL VALUE_PROPERTY VALUE_DATA 
2 1   39   2    Value1  
5 2   39   2    Value2 
8 3   39   2    Value2 
+0

К сожалению нет, результат должен быть основан на value_model (not value_post) и отфильтрован по году. Он должен выглядеть как http://sqlfiddle.com/#!2/d3f3b6/2, только с дополнительным фильтром, который ограничивает его до года. – ryansommers

0

ваша последняя попытка была почти сразу только вы получили подзапросов возвращение более 1 ряд

заменить этот

 && model_values.value_data = (

по

&& model_values.value_data IN (

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

+0

Я скорректировал так, чтобы он не нуждался в таблице моделей: http://sqlfiddle.com/#!2/d3f3b6/26 Это возвращает мне 0. – ryansommers

+0

это ваш простой запрос, и я не знаю, почему вы выбираете value_data = 2012, а затем вы группируете значение value_data, а только в 2012 году. Посмотрите это http://sqlfiddle.com/#!2/d3f3b6/42, и я хочу сказать не существует поля, соответствующего этим условиям. так что, конечно, его пустая –

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