22

2つのテーブルの場合を考えてみましょう:tbl_producttbl_transaction
tbl_product名前とIDを含む製品tbl_transactionの詳細をリストし、製品に関連するトランザクションをリストし、日付、製品ID、顧客などをリストします。

10個の製品と、各製品について、過去5回のトランザクションを示すWebページを表示する必要があります。これまでのところ、クエリは機能していないようで、mysqlがその部分LEFT JOINを許可できれば、以下のサブクエリは機能します( 'where句'の不明な列'ta.product_id'で失敗します:[ERROR:1054])。tx.product_id=ta.product_id

SELECT  
ta.product_id,  
ta.product_name,  
tb.transaction_date  
FROM tbl_product ta  
LEFT JOIN (SELECT tx.transaction_date FROM tbl_transaction tx WHERE tx.product_id=ta.product_id LIMIT 5) tb
LIMIT 10

ループ内で複数のクエリを使用せずに、必要なリストを作成する方法はありますか?

編集:
これはまさにMySQLから必要なものです:

SELECT ta.product_id, ta.product_name, tb.transaction_date ...  
FROM tbl_product ta  
LEFT JOIN tbl_transaction tb ON (tb.product_id=ta.product_id LIMIT 5)  
LIMIT 10

もちろんこれは違法ですが、そうではなかったらいいのにと思います。

4

4 に答える 4

9

これは、ランキング関数が非常に役立つ場所です。残念ながら、MySQLはまだそれらをサポートしていません。代わりに、次のようなものを試すことができます。

Select ta.product_id, ta.product_name
    , tb.transaction_date
From tbl_product As ta
    Left Join   (
                Select tx1.product_id, tx1.transaction_id, tx1.transaction_date
                    , (Select Count(*)
                        From tbl_transaction As tx2
                        Where tx2.product_id = tx1.product_id
                            And tx2.transaction_id < tx1.transaction_id) As [Rank]
                From tbl_transaction As tx1
                ) as tb
        On tb.product_id = ta.product_id
            And tb.[rank] <= 4
Limit 10
于 2010-07-27T23:55:18.783 に答える
3

クエリを括弧で囲み、エイリアス「tb」を付けると、派生テーブルが作成されたため、失敗します。派生テーブルには、エイリアス「ta」を持つtbl_productテーブルに関する知識がありません。

派生テーブルの外部でONまたはWHEREを使用してみてから、指定したエイリアス「tb」を使用してそのテーブルを参照してください

編集:

「LIMIT」を使用すると、クエリの結果全体が制限されます。「LIMIT10」がありますが、実際に必要なのは50行(履歴が5行未満の場合はそれ以下)ですが、そうですか?

10個の製品が5つの履歴レコードに結合され、合計50行が返されます。

この場合、単一のクエリソリューションで、「LIMIT10」を持つ派生テーブル内の製品テーブルをそれ自体に結合することができます。

そのような:

SELECT *
FROM tbl_product ta
JOIN (SELECT * FROM tbl_product tz WHERE tz.product_id = ta.product_id LIMIT 10) tc
LEFT JOIN (SELECT tx.transaction_date FROM tbl_transaction tx 
    WHERE tx.product_id=ta.product_id LIMIT 5) tb

また、「で」、次のように上位10を指定することもできます。

SELECT *
FROM tbl_product ta
LEFT JOIN (SELECT tx.transaction_date FROM tbl_transaction tx 
WHERE tx.product_id=ta.product_id LIMIT 5) tb 
WHERE ta.product_id IN 
  (SELECT z.product_id FROM tbl_product z LIMIT 10)
于 2010-07-27T23:15:48.343 に答える
1

サブクエリを使用してLEFTJOINを作成する方法を見つけました。これは、RDS Amazon、MariaDBv10.2で機能します。

LEFT JOIN activities last_activity ON last_activity.id = ( 
     SELECT id FROM activities 
     WHERE contester_id = contesters.id AND `type` IN ({$last_activity_types}) 
     ORDER BY id DESC LIMIT 1 
)

GROUPINGとSORTINGを使用してLEFTJOINを作成する他のすべての方法は、私にはうまくいきませんでした。この例は動作中の例外です。

于 2018-12-12T10:04:19.833 に答える
0

編集:

各製品に制限を適用したい場合は、2つのクエリに分けます。

最初に10個の製品のリストを取得してから、最後の5つのトランザクションを返す製品ごとに別のクエリを実行します。

于 2010-07-27T23:19:27.647 に答える