0

バックグラウンド

各レコードがアイテムの地域および/またはプラットフォーム固有のバージョンを表す MySQL テーブルがあります。特定のアイテムには、いくつかのバージョンがあります。主キーはなく、ほとんどがインデックス付きの列です。

アイテムのプラットフォーム バージョンごとに 1 つずつ、全世界の記録から始めます。次に、地域固有の値のレコードを追加してから、国固有の値のレコードを追加します。問題は、その地域や国に固有の値を追加することだけを計画しているということです。つまり、繰り返し値を入力したくないため、すべてのレコードに null 値が設定されるので、レコードが他のレコードから値を継承するようにします。

item | platform | region | country | date       | price | [...]
1    | 1        | [WW]   | null    | 2013-04-01 | 100   |
1    | 2        | [WW]   | null    | 2013-04-01 | 100   |
1    | null     | [EU]   | null    | 2013-04-20 | 80    |
1    | null     | [UK]   | null    | null       | 70    |

PHP を使用して、特定の国の関連レコードを表示する予定です。要は、その国の地域記録と世界記録の値を結合・継承できるようにしたいということです。したがって、UK には合計 2 つのレコードがあります。それぞれがレコードplatformから値を継承し、両方がレコードから値を[WW]継承し、両方がレコードから値を持っています。date[EU]price[UK]

1 | 1 | [UK] | 2013-04-20 | 70
1 | 2 | [UK] | 2013-04-20 | 70

私が知りたい質問は、MySQL だけでそれを行うための解決策/手順/方法はありますか? または、それを行う唯一の方法は PHP コーディングを使用することですか?

4

1 に答える 1

1

あなたが要求したもの

これは本当の答えではないことに注意してください。質問で尋ねたものだけを出力しますが、ここでのロジックはほとんど意味がないため、実際のデータベースに適用できる可能性はほとんどありません。

SELECT a.item, b.platform, a.region, a.country, c.date, a.price FROM
    (SELECT item, region, country, price FROM table WHERE platform IS NULL AND date IS NULL GROUP BY item) AS a
    LEFT JOIN 
        (SELECT platform FROM table WHERE platform IS NOT NULL) AS b 
    ON a.item = b.item 
    LEFT JOIN 
        (SELECT date FROM table WHERE PLATFORM IS NULL AND date IS NOT NULL) AS c 
    ON a.item = c.item 

ここでより良い答え

より組織化された、おそらくより簡単な方法(そして、2層以上の親を上がらなくても効率的)は次のようになります。

 id | parent_id | item | platform | region | country | date       | price | [...]
 1  | null      | 1    | 1        | [WW]   | null    | 2013-04-01 | 100   |
 2  | null      | 1    | 2        | [WW]   | null    | 2013-04-01 | 100   |
 3  | 1         | 1    | null     | [EU]   | null    | 2013-04-20 | 80    |
 4  | 2         | 1    | null     | [UK]   | null    | null       | 70    |

SELECT items.*, 
parent_items.platform AS pa_platform, parent_items.region AS pa_region, parent_items.country AS pa_country, parent_items.date AS pa_date, parent_items.price AS pa_price,  
grandparent_items.platform AS gpa_platform, grandparent_items.region AS gpa_region,  parent_items.country AS gpa_country, parent_items.date AS gpa_date, parent_items.price AS gpa_price
FROM items
LEFT JOIN 
    items AS parent_items
ON items.parent_id = parent_items.id
LEFT JOIN 
    items AS grandparent_items
ON parent_items.parent_id = grandparent_items.id

次に、アプリレベルのロジックを使用して最も近い空でない値を表示するかを選択できます。

$region = $result['region'] ? $result['region'] : ($result['pa_region'] ? $result['pa_region'] : $result['gpa_region']);

または、上記のSQLを変更して、最初のnull以外の値を選択することもできます。

SELECT COALESCE(items.region, parent_items.region, grandparent.region) AS region, COALESCE(items.platform, parent_items.platform, grandparent.platform) AS platform, ...

今...実際に依存関係のある行を追加する場合

単純に別のテーブルを作成してみませんか?

各地域、各プラットフォーム、各国の価格があり、優先順位がわかっているとします(たとえば、地域>国>プラットフォームの例として)。

フィールドid/item / platform / date / priceを持つベーステーブル(tbl_platform)を作成してみませんか

次に、フィールドid / platform_id / date / priceを持つ国テーブル(tbl_country)

次に、フィールドid / country_id / date / priceを持つリージョンテーブル(tbl_region)

基本情報が必要な場合は、基本テーブルから直接取得します。地域情報が必要な場合は、地域を国に参加させてから、拠点に参加させます。

于 2013-03-20T04:23:24.133 に答える