Справка по PHP Выберите запрос: ГДЕ x = y И a = b И ЕСЛИ (c! = D) Возможно? - PullRequest
3 голосов
/ 11 мая 2011

Хорошо, мы идем ... У меня есть запрос на выборку для доступа к очень абстрактной базе данных.Мой текущий запрос просматривает 5 таблиц (используя 6 «И», чтобы сделать это ... не весело) и возвращает все записи, соответствующие всем критериям, как и должно быть.

Мой вопрос такой: Могу ли я добавитьчто-то в моем текущем запросе, которое в основном говорит: «Если запись соответствует всем этим, , но НЕ соответствует всем этим ».

Пример:

Мой текущий запрос:

$query = "SELECT s.state_name FROM `tbl_records` r, `tbl_states` s,
 `tbl_events` e, `tbl_fields` f, `tbl_field_values` v 
WHERE s.state_id = r.state_id AND f.field_id = '$field_id' AND 
v.field_id = f.field_id AND v.event_id = e.event_id AND e.record_id = r.record_id
 AND v.value_id = '$field_value' AND v.is_latest = '1'";

Уродливо и долго, верно?Это дает мне все записи, которые соответствуют одному критерию (запись соответствует $ field_id и $ field_value).

Теперь мне нужно взять все записи, найденные этим запросом, но вычесть любую записьэто соответствует другому критерию, что-то вроде "AND (v.event_id = e.event_id AND f.field_id = '155' AND v.value_id != '1');

Это длинная и уродливая версия. Подводя итог:

Мне нужно создать запрос, который выглядит примерно так:
Select "s.state_name FROM a,b,c,d WHERE (a.1 = b.2 AND c.3 = d.4 *etc*) AND ONLY IF (a.2 = b.3 AND c.4 != d.5)"

Возможно ли это? Можете ли вы создать запрос, который говорит: «Если все это соответствует и НЕ соответствует всему этому»?

Дайте мне знать, если кому-то нужно больше разъяснений ..Что меня не удивит. Спасибо всем.

ОБНОВЛЕНИЕ :: Добавление изображения, чтобы попытаться уточнить, что мне нужно.

структура таблицы http://www.everythingsirie.com/values.jpg

Два значения в разделе «нужно добавить» должны относиться к одной и той же записи. Так что в плане «Для этой же записи, в таблице« tbl_field_values ​​», если запись имеет« field_id »из'155' И поле_значения '1', не включайте его. "

Но обратите внимание, что теперь есть два field_id и value_id.Это то, что меня озадачило ...

ОБНОВЛЕНИЕ 2 ::

Я обновил запрос, используя ответы от @ M42 и @Michael.Однако я все равно получаю одинаковое количество возвратов с или без «И НЕ» ...

$query = "SELECT s.state_name FROM `tbl_records` r
INNER JOIN `tbl_states` s ON s.state_id = r.state_id
INNER JOIN `tbl_events` e ON e.record_id = r.record_id
INNER JOIN `tbl_field_values` v ON v.event_id = e.event_id
INNER JOIN `tbl_fields` f ON v.field_id = f.field_id
WHERE f.field_id = '$field_id'
AND v.value_id = '$field_value'
AND v.is_latest = '1'
AND NOT (v.field_id = '155' AND v.value_id = '1')";

Я думаю, проблема в том, что field_id и value_id мне нужно НЕ совпадения находятся в той же таблице, что и field_id и value_id, которые я DO должен сопоставить.Вот картинка, показывающая field_id 155 с обоими значениями value_id 1 и 0.

Мне НЕ нужно включать записи, имеющие значение value_id 1, ТОЛЬКО когда field_id равно 155 ... Но в то же времяраз я AM пытаюсь выбрать записи с field_id = 12 и value_id = 1 ...

структура таблицы http://www.everythingsirie.com/valueid.jpg

Я знаю, что это беспорядок... Извините.

Ответы [ 3 ]

3 голосов
/ 11 мая 2011

Насколько вы понимаете, вы можете добавить к вашему запросу:

AND NOT (f.field_id = '155' AND v.value_id != '1')
2 голосов
/ 11 мая 2011

Вместо этого вы можете использовать ВНУТРЕННИЕ СОЕДИНЕНИЯ для объединения таблиц.Они делают то же самое, что и объединение таблиц с предложениями WHERE, но выглядят лучше ИМХО ... это не загромождает предложение WHERE.

0 голосов
/ 12 мая 2011

Здесь для обновления 2:

SELECT s.state_name
FROM `tbl_records` r
  INNER JOIN `tbl_states` s ON s.state_id = r.state_id
  INNER JOIN `tbl_events` e ON e.record_id = r.record_id
  INNER JOIN `tbl_field_values` v ON v.event_id = e.event_id
  INNER JOIN `tbl_fields` f ON v.field_id = f.field_id
WHERE ((f.field_id = '12' AND v.value_id = '1')
  OR (v.field_id = '155' AND v.value_id != '1'))
  AND v.is_latest = '1'
...