使用JOIN删除多余的SQL查询(在PHP中)



我正试图清理我的SQL查询,并在曾经使用过两个查询的ONE中使用JOIN。

以下是以前的代码(PHP):

$cat = "books";  // as a test 
$query = "SELECT category, cat_id FROM master_cat WHERE category = '{$cat}'";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result)) {
    $cat_id = $row['cat_id'];
}
$sql = mysql_query("SELECT item, spam, cat_id FROM items WHERE cat_id = ' " . $cat_id . "' ORDER BY TRIM(LEADING 'The ' FROM item) ASC;");  
while ($row = mysql_fetch_assoc($sql))
    if ($row['spam'] < 2)
        $output[] = $row;

print(json_encode($output));  // added!

我正试图删除顶部查询并使用JOIN。更新后的SQL语句如下:

编辑:我在原来的问题上犯了一个错误。基本上,用户输入会给我们$cat="某物"。master_cat表中有一个cat_id的"something"。cat_id也在items表中。这就是我需要连接表的地方——where子句需要包含"$cat"

更新的查询:

    $result = mysql_query("SELECT i.item, i.spam, mc.cat_id AS Category
FROM items as i
INNER JOIN master_cat as mc
ON i.cat_id = mc.cat_id
WHERE i.cat_id = '{$cat}'
ORDER BY TRIM(LEADING 'The ' FROM i.item) ASC;");

然后:

   while ($row = mysql_fetch_assoc($result))
    if ($row['spam'] < 2)
        $output[] = $row;

我在浏览器中收到此消息:无效的

有人能指导我如何正确使用JOIN吗?我知道这将真正清理这里的东西,并进行更高效的编码。我刚刚看了一个教程,但仍然不太明白。

这是有效的最终代码

$cat = $_POST['category']; // yes, yes, injection.  this is just the short version.
$result = mysql_query("SELECT i.item, i.cat_id, i.spam,  mc.cat_id, mc.category, TRIM(LEADING 'The ' FROM i.item) as CleanItem
FROM items as i
INNER JOIN master_cat as mc
ON i.cat_id = mc.cat_id
WHERE mc.category = '{$cat}'
ORDER BY CleanItem ASC;");
while ($row = mysql_fetch_assoc($result))
    if ($row['spam'] < 2)
        $output[] = $row;

您已经在WHERE子句中通过其全名引用了items表,您应该使用您创建的别名(i)。

ORDER BY子句中还有一个不明确的列引用item

尝试将最后两行更改为:

WHERE i.cat_id = '{$cat_id}'
ORDER BY TRIM(LEADING 'The ' FROM i.item) ASC

您还应该检查mysql_error()以获得错误的字符串描述,这将直接指向问题。

$sql = "SELECT i.item, i.spam, mc.cat_id AS Category
FROM items as i
INNER JOIN master_cat as mc
ON i.cat_id = mc.category
WHERE items.cat_id = '{$cat_id}'
ORDER BY TRIM(LEADING 'The ' FROM item) ASC";

既然你对它进行了别名处理,你就必须保持它的别名:修复倒数第二行:

WHERE i.cat_id = '{$cat_id}'

试试这个:

$sql = "SELECT i.item, i.spam, mc.cat_id AS Category
FROM items as i
INNER JOIN master_cat as mc ON i.cat_id = mc.cat_id
WHERE i.cat_id = '{$cat_id}'
ORDER BY TRIM(LEADING 'The ' FROM item) ASC";

如果将items别名为i,则应在其他任何位置使用i。此外,mc.category似乎不存在,所以我用mc.cat_id替换了它。mysql_error说什么?

您对初始查询的响应可能为false,而不是结果集

您应该在i.cat_id=mc.cat_id 上加入

您可能还应该在select语句中执行i.item清理(即删除"The")(如果您需要保持i.item完整,即使是作为一个单独的字段),然后按该字段排序。

您应该引用i.cat_id="{$cat_id〕}",而不是items.cat_id

最新更新