用别名连接查询

时间:2018-11-23 13:40:43

标签: php mysql sql database

我有一个查询来搜索三个内容,一个关键字,一个类别和一个区域(用于职位空缺)。除了区域之外,其他所有东西都可以正常工作,因为我从数据库中使用别名为该列。

现在我的代码:

$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 :(得分:0)

我们不能在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 . "%'";
}

答案 1 :(得分:0)

查看您的代码似乎您正在尝试将汇总结果max(...)过滤为区域

要过滤汇总结果,应使用hading

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

无论如何,您都在sql中使用php var,这会使您的代码有被sqlinjecttion的风险..您应该查看数据库驱动程序中准备好的语句和绑定参数

您还在select无分组依据中使用了非聚合列..在SQL中已弃用此列,不允许使用不可预测的列结果,而在最新版本的mysql中则不允许使用。