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

时间:2012-07-24 21:54:58

标签: php sql join

我正在尝试清理我的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;

我在浏览器中收到此消息: 空。

有人可以指导我如何正确使用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 个答案:

答案 0 :(得分: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}'

答案 1 :(得分:2)

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

您的item子句中也有一个含糊不清的列引用ORDER BY

尝试将最后两行更改为:

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

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

答案 2 :(得分: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";

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

答案 3 :(得分:1)

您可能会因为对初始查询的回复而不是结果集

而得到错误

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

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

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