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

Хорошо, мы идем... У меня есть запрос на выборку, обращающийся к очень абстрактной базе данных Мой текущий запрос просматривает 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 "И field_value, равное" 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, которые мне НЕОБХОДИМЫ для сопоставления. Вот изображение, показывающее field_id 155 со значением value_id 1 и 0.

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

http://www.everythingsirie.com/valueid.jpg

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

3 ответа

Решение

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

AND NOT (f.field_id = '155' AND v.value_id != '1')

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

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'

Здесь для обновления 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'
Другие вопросы по тегам