[英]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 ? ";
此外,请注意您正在混合AND
和OR
。 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.