Где предложение не работает для всех столбцов в MySQL Select-Query - PullRequest
1 голос
/ 03 апреля 2019

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

$abfrage = "SELECT id, motivname, preis, masse, produktart, neu, angebot FROM $db.artikel
 INNER JOIN $db.formate ON $db.artikel.format=$db.formate.format
 WHERE (UPPER(motivname) LIKE UPPER('%{$keywordAct}%')
 OR id LIKE '%{$keywordAct}%'
 OR UPPER(produktart) LIKE UPPER('%{$keywordAct}%'))
 AND $db.artikel.aktiv=1
 ORDER BY id";

Запрос работает отлично, за исключением того, что выражение aktiv = 1 опущено. Результаты также будут отображаться там, где для aktiv установлено значение 0. «aktiv» - это int-столбец в таблице «artikel» (см. Ниже).

Однако запрос работает нормально, если я переключаю последнее предложение

AND $db.artikel.aktiv=1

например

AND $db.artikel.neu=1

Статьи, где neu = 0, не отображаются, что также является int-столбцом.

Так что я думаю, что есть проблема в настройке таблицы в MySQL, но я не могу ее решить. Есть еще один столбец «aktiv» в другой таблице той же базы данных, но эта таблица не адресована этим запросом, и я также указываю столбец aktiv таблицы artikel.

Настройка таблицы выглядит следующим образом:

CREATE TABLE `artikel` (
 `id` varchar(11) COLLATE utf8_bin NOT NULL,
 `motivnummer` int(4) NOT NULL,
 `motivname` varchar(255) COLLATE utf8_bin NOT NULL,
 `format` int(2) NOT NULL,
 `preis` decimal(10,2) NOT NULL,
 `anzahl_lager` int(3) NOT NULL,
 `anzahl_verkauft` int(4) NOT NULL,
 `anzahl_kostenlos` int(4) NOT NULL,
 `aktiv` int(1) NOT NULL,
 `neu` int(1) NOT NULL,
 `angebot` int(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

Я рад некоторой информации о том, как сделать запрос таким, каким он должен быть. Заранее спасибо.

PS: по соображениям безопасности ключевые слова уже экранированы заранее.

1 Ответ

1 голос
/ 03 апреля 2019

Вы добавили OR предложение.

Таким образом, даже если artikel.aktiv равно 0, а другое условие истинно, он вернет строки с aktiv 0.

Решение:

И правильные фигурные скобки.

$abfrage = "SELECT id, motivname, preis, masse, produktart, neu, angebot FROM $db.artikel
 INNER JOIN $db.formate ON $db.artikel.format=$db.formate.format
 WHERE ((UPPER(motivname) LIKE UPPER('%{$keywordAct}%')
 OR id LIKE '%{$keywordAct}%'
 OR UPPER(produktart) LIKE UPPER('%{$keywordAct}%')))
 AND ($db.artikel.aktiv=1)
 ORDER BY id";

Все ваши условия были в OR.

AND условие будет работать, только если вы отделите его от OR.

...