1

私はAPEXのオークションサイトで働いています。オークションサイトでは、誰かが購入した商品の概要を説明する必要があります。確かにそれは私が忘れていたものですが、次の状況で結果を取得するにはどうすればよいですか。

3つのテーブル

Table User
USER_ID
EMAIL

Table Product
PRODUCT_ID
USER_ID

Table Bid
BID_ID
PRODUCT_ID
USER_ID
CREDITS

もちろん、もっと多くの列がありますが、それらを省略すると、説明が少し簡単になると思います。

必要な結果

Productテーブルからの製品の表示。ただし、現在のユーザーが最高の入札単価(クレジット)を持っている場合に限ります。

ここのところ

私はこれについて多くのことを考え/試してきましたが、サブクエリの最後に殺され続けています。

SELECT *
FROM "PRODUCT"
WHERE "PRODUCT_ID" IN (SELECT "PRODUCT_ID" FROM "BID"
                      WHERE "USER_ID" = 
                      (SELECT "USER_ID" FROM "USER"
                      WHERE lower("EMAIL") = lower(:APP_USER)))
  and "PRODUCT_ID" = (SELECT "PRODUCT_ID" FROM "BID"
                      WHERE "CREDITS" =
                     (SELECT MAX("CREDITS") FROM "BID"
                      WHERE "PRODUCT_ID" = ?

* Apexは現在のユーザー(:APP_USER)からEmailadressを返します

ユーザーフィルタリングが正常に機能するため、実際の問題は「and」から始まります。サブクエリで比較された(現在の)PRODUCT_IDを取得する方法がわかりません。サブクエリの最後でその値を取得すれば、それは機能すると確信しています。

OracleDBでの作業。

助けていただければ幸いです:)

4

2 に答える 2

1

これで試してみてください。

SELECT *
FROM PRODUCT p
WHERE p.PRODUCT_ID IN (SELECT PRODUCT_ID FROM BID"
                      WHERE "USER_ID" = 
                      (SELECT "USER_ID" FROM "USER"
                      WHERE lower("EMAIL") = lower(:APP_USER)))
  and "PRODUCT_ID" =  (SELECT "PRODUCT_ID" FROM "BID" b
                      WHERE "CREDITS" =
                     (SELECT MAX("CREDITS") FROM "BID"
                      WHERE b.PRODUCT_ID" = p.product_id));

また

and "PRODUCT_ID" in (SELECT "PRODUCT_ID" FROM "BID" b
                      WHERE "CREDITS" =
                     (SELECT MAX("CREDITS") FROM "BID"
                      WHERE b.PRODUCT_ID" = p.product_id))
于 2013-01-04T15:16:58.440 に答える
1

このようなもの?

SELECT
    p.*
FROM
    Bid b
    JOIN
    -- get the max bid per product
    (SELECT
        PRODUCT_ID, MAX(CREDITS) AS MAX_C
    FROM
        Bid
    GROUP BY
        PRODUCT_ID) m ON b.PRODUCT_ID = m.PRODUCT_ID AND b.CREDITS = m.CREDITS
    JOIN USER u ON b.USER_ID = u.USER_ID
    JOIN Product p ON b.PRODUCT_ID = p.PRODUCT_ID
WHERE
    lower(u.EMAIL) = lower(:APP_USER)));

入札のクレジットが商品ごとに一意でない場合は問題が発生する可能性があることに注意してください(ただし、それはとにかくオークションのビジネスルールである必要があります)。

編集

クエリの長​​さの観点から、これまでにすべての商品をチェックする上記とは対照的に、ユーザーが実際に入札した商品の落札のみをチェックすることを保証するため、以下の方がおそらく優れています。

SELECT
    p.*
FROM
    Bid b
    JOIN
    -- get the max bid per product that the user bid on
    (SELECT
        PRODUCT_ID, MAX(CREDITS) AS MAX_C
    FROM
        Bid b2
        JOIN (
            -- get only the products that the user has bid on
            SELECT
                DISTINCT b1.PRODUCT_ID
            FROM
                Bid b1
                JOIN User u1 ON b1.USER_ID = u1.USER_ID
            WHERE
                lower(u1.EMAIL) = lower(:APP_USER))) dp
        ON b2.PRODUCT_ID = dp.PRODUCT_ID
    GROUP BY
        PRODUCT_ID) m ON b.PRODUCT_ID = m.PRODUCT_ID AND b.CREDITS = m.CREDITS
    JOIN USER u ON b.USER_ID = u.USER_ID
    JOIN Product p ON b.PRODUCT_ID = p.PRODUCT_ID
WHERE
    lower(u.EMAIL) = lower(:APP_USER)));
于 2013-01-04T15:24:53.950 に答える