1

SQLクエリをクリーンアップし、かつて2つのクエリを使用していた1つだけで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";

エイリアスを作成したので、エイリアスのままにしておく必要があります。最後から2番目の行を修正します。

WHERE i.cat_id = '{$cat_id}'
于 2012-07-24T21:59:52.350 に答える
2

items句でフルネームでテーブルを参照しています。WHERE作成したエイリアスを使用する必要があります(i)。

また、句にあいまいな列参照itemがあります。ORDER BY

最後の2行を次のように変更してみてください。

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

結果セットではなく、最初のクエリへの応答としてfalseを取得している可能性があります

i.cat_id=mc.cat_idに参加する必要があります

また、おそらくselectステートメントでi.itemのクリーニング(つまり、'The'の削除)を実行してから(i.itemをそのまま維持する必要がある場合は、別のフィールドとしても)、そのフィールドで並べ替える必要があります。

items.cat_idではなく、i.cat_id='{$cat_id]}'を参照する必要があります

于 2012-07-24T22:00:26.313 に答える