あなたが要求したもの
これは本当の答えではないことに注意してください。質問で尋ねたものだけを出力しますが、ここでのロジックはほとんど意味がないため、実際のデータベースに適用できる可能性はほとんどありません。
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)
基本情報が必要な場合は、基本テーブルから直接取得します。地域情報が必要な場合は、地域を国に参加させてから、拠点に参加させます。