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