1

我正在尝试清理我的 SQL 查询并在我曾经使用过两个查询的地方使用 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 = "something"。master_cat 表中有一个带有 cat_id 的“东西”。该 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;

我在浏览器中收到这个:null。

有人可以指导我如何正确使用 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;
4

4 回答 4

2
$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}'
于 2012-07-24T21:59:52.350 回答
2

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

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

尝试将最后两行更改为:

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

您还应该检查mysql_error()以获取错误的字符串描述,这会直接指出问题所在。

于 2012-07-24T22:00:23.537 回答
1

试试这个:

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

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

于 2012-07-24T21:59:50.410 回答
1

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

你应该加入 i.cat_id = mc.cat_id

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

您应该参考 i.cat_id = '{$cat_id]}',而不是 items.cat_id

于 2012-07-24T22:00:26.313 回答