别名连接查询

7uhlpewt  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(348)

我有一个查询,搜索三件事,一个关键字,一个类别和一个地区(它的空缺)。除了区域之外,所有的东西都能工作,因为我从数据库中得到了一个别名为的列。
我的代码现在:

$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);

但上述代码并不适用于该地区。
不过,这是endresult查询,我得到的结果如下:

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%'

regio 是我想展示结果的原因。
但是 WHERE regio LIKE '%" . $regio . "%'"; 不起作用,它说未知列 regio 因为它是一个别名。如何仅显示所发布区域的所有结果?例如上图,当 Drenthe 是发布的区域。

mgdq6dx1

mgdq6dx11#

查看您的代码似乎您正在尝试将聚合结果max(…)筛选为regio
对于聚合结果,应该使用

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

不管怎样,如果您在sql中使用php var,那么您的代码将面临sql注入的风险。。您应该查看db驱动程序,以获取准备好的语句和绑定参数
您还在select without group by.中使用not aggregated列。。这在sql中已被弃用,不允许对unexpectable中的列和最新版本的mysql中的列执行此操作。

ztyzrc3y

ztyzrc3y2#

不能在中使用别名计算表达式 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 . "%'";
}

相关问题