2

私ではなく既存のコードに自分でバグを修正しようとしています。このコードのバグは、対応するIDの2番目のテーブルにアイテムがない限り、出力にはまったく表示されません。1番目のテーブル(メール)には複数のエントリがあり、出力でフィルターされたthoは、メールの正しい総数を示します...メールに2番目のテーブルにinが含まれているアイテムがない限り、出力されません。差分結合を使用して別のクエリを試しました

SELECT 
    id, 
    messageType, 
    sender, 
    mail.receiver, 
    subject, 
    body, 
    has_items, 
    money, 
    cod, 
    checked 
FROM 
    mail 
        LEFT OUTER JOIN mail_items 
            ON id = mail_id 
        LEFT JOIN item_instance 
            ON item_guid = guid

問題は...エラーが発生する:SQL構文にエラーがあります。'LIMIT 1'の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

メールテーブルとmail_itemsテーブルの両方が結合し、3番目のテーブルからアイテムGUIDを適切に取得し、mail_itemsテーブルにそのメールのアイテムがない場合でもメールテーブルエントリを出力するようにするにはどうすればよいですか。

//==========================$_GET and SECURE=================================
$start = (isset($_GET['start'])) ? $sqlc->quote_smart($_GET['start']) : 0;
if (is_numeric($start)); 
else 
    $start = 0;

$order_by = (isset($_GET['order_by'])) ? $sqlc->quote_smart($_GET['order_by']) : 'id';
if (preg_match('/^[_[:lower:]]{1,12}$/', $order_by)); 
else 
    $order_by = 'id';

$dir = (isset($_GET['dir'])) ? $sqlc->quote_smart($_GET['dir']) : 1;
if (preg_match('/^[01]{1}$/', $dir)); 
else 
    $dir = 1;

$order_dir = ($dir) ? 'ASC' : 'DESC';
$dir = ($dir) ? 0 : 1;
//==========================$_GET and SECURE end=============================

$query = $sql->query("SELECT a.id, a.messageType, a.sender, a.receiver, a.subject, a.body, a.has_items, a.money, a.cod, a.checked, b.item_guid, c.itemEntry
                      FROM mail a INNER JOIN mail_items b ON a.id = b.mail_id LEFT JOIN item_instance c ON b.item_guid = c.guid ORDER BY $order_by $order_dir LIMIT $start, $itemperpage");
$total_found = $sql->num_rows($query);
$this_page = $sql->num_rows($query);
$query_1 = $sql->query("SELECT count(*) FROM `mail`");
$all_record = $sql->result($query_1,0);
4

3 に答える 3

0

次のようなことを試してください:

SELECT 
/*
    The columns that you want to select
*/
FROM 
    mail a
LEFT OUTER JOIN mail_items b ON a.id = b.mail_id 
LEFT JOIN item_instance c ON b.item_guid = c.guid

列を選択しようとしているときは、適切なテーブル エイリアスを列名に付けていることを確認してください。ここで、 テーブルmailmail_itemsおよびitem_instancea、それぞれエイリアスとしてb、を持っています。c

テーブルに同じエイリアスを保持する上記のクエリを使用している場合は、コードに次の変更を加える必要があります。

$order_by = (isset($_GET['order_by'])) ? $sqlc->quote_smart($_GET['order_by']) : 'id';
if (preg_match('/^[_[:lower:]]{1,12}$/', $order_by)); 
else 
    $order_by = 'a.id';
于 2012-09-09T05:59:28.987 に答える
0

私は SQL の達人ではありませんが、

FROM mail a INNER JOIN mail_items b 

ASエイリアスの割り当てには次のキーワードが必要です。

FROM mail AS a INNER JOIN mail_items AS b 
于 2012-09-09T06:02:09.437 に答える
0

このタイプを試してください 。select * from table1 as T1 join table2 as T2 on T.id=T2.id join table3 as T2.id=T3.id

于 2012-09-09T06:11:16.647 に答える