プロンプトについて
あなたが実行したいSQL文を、PHPフレームワークのLaravelの機能であるクエリビルダで表現します。
外部からSQLに渡すパラメータがある場合にもなるべく配慮するような指令を含んでいます。
実行したいSQLはわかっているけど、クエリビルダにするのが煩雑で面倒なときなどにお役立てください。
プロンプトが持つ変数
- SQLの実行を想定しているデータベース名
- クエリビルダで表現させたいSQL
出力例
生成された回答例
Laravelのクエリビルダを使用して、指定されたSQLを実装すると以下のようになります。
```php
use Illuminate\Support\Facades\DB;
// param1とparam2は外部からの入力として想定
$param1 = ...; // 例: 100
$param2 = ...; // 例: 5
$monthlySales = DB::table('orders')
->selectRaw('EXTRACT(MONTH FROM order_date) AS month')
->selectRaw('product_id')
->selectRaw('SUM(quantity) AS total_quantity')
->groupByRaw('EXTRACT(MONTH FROM order_date), product_id');
$topProducts = DB::table(DB::raw("({$monthlySales->toSql()}) as monthly_sales"))
->selectRaw('month')
->selectRaw('product_id')
->selectRaw('RANK() OVER (PARTITION BY month ORDER BY total_quantity DESC) AS rank')
->where('total_quantity', '>', $param1)
->mergeBindings($monthlySales);
$results = DB::table('products as p')
->joinSub($topProducts, 't', function ($join) {
$join->on('p.product_id', '=', 't.product_id');
})
->join('categories as c', 'p.category_id', '=', 'c.category_id')
->leftJoin('manufacturers as m', 'p.manufacturer_id', '=', 'm.manufacturer_id')
->select('p.product_name', 'c.category_name', 't.month', 't.total_quantity', 'm.manufacturer_name')
->where('t.rank', '<=', $param2)
->orderBy('t.month', 'asc')
->orderBy('t.rank', 'asc')
->get();
return $results;
```
注意:
- `param1`と`param2`は外部からの入力として仮定しています。その値を適切にセットする必要があります。
- このコードは、Laravelのクエリビルダを使用して指定されたSQLを模倣しています。
- SQLインジェクションのリスクを回避するため、クエリビルダの結合機能や変数バインディングを使用しています。
渡したSQL
データベース名はMySQLを指定し、下記のような少し複雑なSQLを渡しています。
WITH monthly_sales AS (
SELECT
EXTRACT(MONTH FROM order_date) AS month,
product_id,
SUM(quantity) AS total_quantity
FROM
orders
GROUP BY
EXTRACT(MONTH FROM order_date), product_id
),
top_products AS (
SELECT
month,
product_id,
RANK() OVER (PARTITION BY month ORDER BY total_quantity DESC) AS rank
FROM
monthly_sales
WHERE
total_quantity > /*param1*/
)
SELECT
p.product_name,
c.category_name,
t.month,
t.total_quantity,
m.manufacturer_name
FROM
products p
JOIN
top_products t ON p.product_id = t.product_id
JOIN
categories c ON p.category_id = c.category_id
LEFT JOIN
manufacturers m ON p.manufacturer_id = m.manufacturer_id
WHERE
t.rank <= /*param2*/
ORDER BY
t.month ASC, t.rank ASC;
このSQLは以下の処理を実行しています
- monthly_sales サブクエリで、月ごとの商品の売上数量を集計します。
- top_products サブクエリで、月ごとの上位の商品を特定します(例として、月ごとに売上数量が50以上の商品を取得し、それらの商品にランクを付けます)。
- 最後のSELECT文で、上位の商品の詳細(商品名、カテゴリ名、メーカー名など)を取得します。