gpt4 book ai didi

php - 使 SQL 记录继承同一表中一条或多条记录的值

转载 作者:行者123 更新时间:2023-11-29 13:59:26 24 4
gpt4 key购买 nike

背景

我有一个 MySQL 表,其中每条记录代表项目的特定于区域和/或平台的版本。对于任何给定的项目,都会有多个版本;没有主键并且大部分是索引列。

我从全局记录开始,每个记录对应该项目的每个平台版本。然后,我添加任何特定于区域的值的记录,然后添加任何特定于国家/地区的值的记录。问题是我只打算添加该地区或国家特有的值(value);换句话说,所有记录都将具有空值,因为我不想输入重复的值,因此我希望记录从其他记录继承值。

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 编码?

最佳答案

您的请求

请注意,这不是真正的答案。它只输出您在问题中询问的内容,但这里的逻辑几乎没有任何意义,因此它不太可能适用于真正的数据库。

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 以选择第一个非空值:

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)

然后是一个国家/地区表 (tbl_country),其中包含字段 id/platform_id/date/price

然后是一个区域表 (tbl_region),其中包含字段 id/country_id/date/price

如果您想要基础信息,只需直接从基础表中获取它,如果您想要区域信息,请将区域连接到国家/地区,然后连接到基础。

关于php - 使 SQL 记录继承同一表中一条或多条记录的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15327462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com