2013-03-10 13 views
0

фонасделать значение INHERIT SQL записей из одной или нескольких записей в одной таблице

У меня есть таблица MySQL, для которой каждая запись представляет собой Region- и/или конкретную платформу версию элемента. Для любого данного элемента будет несколько версий; нет первичного ключа и в основном индексированных столбцов.

Я начинаю с записей по всему миру, по одному для каждой версии платформы. Затем я добавляю записи для любых значений, специфичных для региона, а затем добавляю записи для любых значений для конкретной страны. Дело в том, что я только планирую добавлять ценности, которые уникальны для этого региона или страны; другими словами, все записи будут иметь нулевые значения, потому что я не хочу вводить повторяющиеся значения, поэтому я хочу, чтобы записи наследовали значения из других записей.

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 для отображения соответствующих записей для данной страны. Дело в том, что я хочу иметь возможность совмещать/унаследовать ценности из региона и записи по всему миру. Таким образом, у Великобритании будет две общей записи: каждая из них наследует значение platform от записи [WW], наследуя значение date от [EU], и оба имеют значение price из записи [UK].

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

Вопрос, который я хочу знать, есть решение/процедура/метод выполнения этого только в MySQL? Или это единственный способ сделать это через PHP-кодирование?

+0

Уточнение: я думаю, нам нужна фиксированная логика здесь, так вы пытаетесь это сделать? Выберите строки с нулевым значением как платформу и null в качестве даты, присоедините их к одному элементу # с ненулевой платформой, получите платформу. Затем присоедините это значение с нулевым значением как платформу и не null в качестве даты, введите дату. Если это так, то это легко выполнимо, но вам будет лучше с несколькими таблицами. –

+0

Здесь больше столбцов, чем показано; это не просто получение тех, которые я показал. В любом случае, должны ли я иметь отдельные «доступность платформы», «глобальные», «региональные» и «национальные» таблицы? –

+0

Это все равно будет зависеть от вашей логики. Некоторые вопросы, которые нужно задать: Какова ваша логика, которая говорит программе показывать (1 | 1 | UK, 1 | 2 | UK), а не (1 | 1 | EU, 1 | 2, EU)? Было бы проще, если бы у вас была «WW-таблица» в качестве прототипа и реальной таблицы «предметов», или вам нужно собрать их вместе, потому что вы планируете связывать элементы через произвольное количество «родительских» элементов (UK -> EU -> WW, или AU -> WW, или Chicago -> IL -> US -> WW), и в этом случае вам понадобится дополнительное поле с именем «parent_item_id» в той же таблице. –

ответ

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 

Better Ответ Здесь

более организованной и, возможно, более простой способ (и еще эффективнее, если вы не идти более 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, чтобы выбрать первый ненулевое значение:

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

Теперь ... Если вы на самом деле собираетесь добавлять строки с зависимостями

Почему бы не просто сделать разные таблицы?

Предположим, что вы будете иметь цену для каждого региона, каждой платформы, каждой стране, и вы знаете, порядок старшинства (скажем, в качестве примера область> страны> платформы):

Почему бы не сделать базу таблица (tbl_platform) с полями ид/пункт/платформы/дата/цена

тогда страна стол (tbl_country) с полями ID/platform_id/дате/цене

затем область таблицы (tbl_region) с полями ID/country_id/date/price

Если вам нужна базовая информация, просто возьмите ее непосредственно из базовой таблицы, и если вы хотите получить информацию о регионе, присоедините регион к стране, а затем к базе.

+1

Теперь у меня есть отдельные таблицы для платформ, цен, рейтингов, обложек, заголовков и дат выпуска. У каждого из них есть, за исключением таблиц платформ, столбцов «регион» и «страна», а затем столбец для конкретной цены и т. Д. Я использую эту настройку, потому что версия страны может иметь другую или ту же цену/покрытие/название/дата/рейтинг как регион. В основном для данной страницы страны я хочу, чтобы запись страны в данной таблице атрибутов имела приоритет над любой совпадающей записью региона в той же таблице. Спасибо за ваш вклад; Я работаю над этой новой задачей. –

+0

Добро пожаловать, рад, что вы поняли свою логику. Вот почему мы всегда переходим от Logic -> Database -> (Controller <-> View) –

Смежные вопросы