Справка по 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'