Присоединиться к запросу с псевдонимом - PullRequest
0 голосов
/ 23 ноября 2018

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

Мой код сейчас:

$functie = $_POST['functie'];
$branche = $_POST['branche'];
$regio = $_POST['regio'];

$search = "
SELECT cnt.title as content_title, cnt.alias as content_alias, cnt.images, cnt.introtext, cnt.catid, cat.title as cat_title, cat.alias as cat_alias,
MAX(case when f.field_id = 2 then f.value end) as regio
FROM snm_content cnt
LEFT JOIN snm_categories cat
ON cat.id = cnt.catid
LEFT JOIN snm_fields_values f
ON cnt.id = f.item_id
";
// Collect all the where conditions in an array
$whr = array();

// check if $functie has some value in input filter
if (!empty($functie)) {
    $whr[] = "cnt.title LIKE '%" . $functie . "%'";
}

if (!empty($regio)) {
    $whr[] = "f.value LIKE '%" . $regio . "%'";
}

// check if $branche has some value in input filter
if (!empty($branche)) {
    $whr[] = "cat.title LIKE '%" . $branche . "%'";
}

$where_sql = '';
// Prepare where part of the SQL
if (!empty($whr)) {

    $where_sql = ' WHERE ' . implode(' OR ', $whr);
}

// Append to the original sql
$search .= $where_sql;
$searchcon = $conn->query($search);

Но приведенный выше код не работает для региона.

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

SELECT cnt.title as content_title, cnt.alias as content_alias, cnt.images, cnt.introtext, cnt.catid, cat.title as cat_title, cat.alias as cat_alias,
MAX(case when f.field_id = 2 then f.value end) as regio
FROM snm_content cnt
LEFT JOIN snm_categories cat
ON cat.id = cnt.catid
LEFT JOIN snm_fields_values f
ON cnt.id = f.item_id
WHERE cnt.title LIKE '%vrachtwagen%'

enter image description here

regio - это то, что яхочу показать результаты для.

Но WHERE regio LIKE '%" . $regio . "%'"; не работает, он говорит неизвестный столбец regio, потому что это псевдоним.Как я могу показать только все результаты, относящиеся к региону, который был опубликован?Например, изображение выше, показывать только эту строку, когда Drenthe является опубликованным регионом.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

при просмотре вашего кода кажется, что вы пытаетесь отфильтровать сводный результат max (...) как regio

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

HAVING regio  like concat('%', $your_value, '%')

в любом случае вывы используете php var внутри sql, этот код подвержен риску для sqlinjecttion .. вам следует взглянуть на драйвер db для подготовленного оператора и параметра связывания

Вы также используете не агрегированный столбец в select без группировки по.в sql это устарело, результат для столбцов в непредсказуемой и в последней версии mysql не допускается.

0 голосов
/ 23 ноября 2018

Мы не можем использовать псевдоним вычисляемого выражения в предложении Select внутри предложения Where.Помните, что Select вычисляется после Where, поэтому вычисление выражения происходит позже.

Вы должны будете снова указать полное выражение в предложении Where.

// check if $regio has some value in input filter
if (!empty($regio)) {
    $whr[] = "MAX(case when f.field_id = 2 then f.value end) LIKE '%" . $regio . "%'";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...