繁体   English   中英

通过联接和搜索完成SQL查询

[英]Finalize SQL query with joins and with search

我来这里是为了寻求帮助。 我的目标是获取页面管理类别中的类别列表,并在每个类别的名称旁边显示按类别发布的文章数(状态1)。 无需搜索,它就可以工作。 通过利弊,输入WHERE搜索关键字以根据输入的关键字显示我的类别列表,或者我不能。 使用下面的代码,他尝试在我的表“ articles”中而不是在我的表“ categories”中进行搜索。 _我不知道如何在我的请求中添加LIKE,以便在我的表格类别中进行搜索? 这是我的代码:

<?php
/*
* categories : Table of categories that can be connected to articles
* articles : Table of articles
* categories_jointes_articles : Pivot Table (which has a id_article fields and id_categorie)
*/
$sql = "SELECT categories.id, categories.nom
    , COUNT(articles.id) as nb_articles
    FROM categories
    LEFT OUTER JOIN categories_jointes_articles
        ON categories.id = categories_jointes_articles.id_categorie

    LEFT OUTER JOIN articles
        ON articles.id = categories_jointes_articles.id_article
        WHERE articles.statut = ?
        OR statut IS NULL";

$sql .= " AND nom LIKE ? ";     // c'est cette ligne que je ne sais pas où mettre

$sql .= " GROUP BY categories.id, categories.nom";

$requete = self::getDb()->prepare($sql);

$requete->bindValue(1, 1, PDO::PARAM_INT);
$requete->bindValue(2, '%'.$mots.'%', PDO::PARAM_STR);
$requete->execute();
$requete->setFetchMode(PDO::FETCH_OBJ);
return $requete;
$db = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$sth = $db->prepare("INSERT INTO test.test_table VALUE(null, 'a XYZ name', 'a text', now())");
$sth->execute();
$sth = $db->prepare("SELECT * FROM test.test_table WHERE test_name LIKE ?");
$search = "XYZ";
$sth->bindValue(1, "%$search%", PDO::PARAM_STR);
$sth->execute();
$sth->setFetchMode(PDO::FETCH_OBJ);

while($row = $sth->fetch()){
    echo $row->test_name."<br>";
}

输出:

XYZ名称

以上对我有效。 请尝试同时使用$requete->bindParam$requete->bindValue 两种功能是不同的。 您可以修改PHP以适应您的需求。 请让我知道你的结果。

您的“ getDb()”返回什么? 我假设返回一个PDO句柄。

您说搜索是针对articles而不是categories ,因此我假设两个表都具有列nom

DBMS应该抱怨含糊不清,而不是决定两列之一并根据猜测执行查询。 我认为这不是一个缺陷。

因为有两个具有相同列名的表,所以必须用表名来限定列名,以便向DBMS显示您正在谈论的字段。

$sql .= " AND categories.nom LIKE ? ";

此外,请注意您正在混合ANDOR AND在SQL中优先于OR ,因此

WHERE articles.statut = ? OR statut IS NULL AND nom LIKE ?

等于

WHERE (articles.statut = ?) OR (statut IS NULL AND nom LIKE ?)

但是你想要

WHERE (articles.statut = ? OR statut IS NULL) AND nom LIKE ?

因此:

        WHERE (articles.statut = ?
        OR statut IS NULL)";

$sql .= " AND categories.nom LIKE ? ";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM