繁体   English   中英

SQL 查询通过不同的列值连接具有相同名称和值的列

[英]SQL query for joining a column with same name and value by different column value

尝试在一个关联数组下的一列中连接多个表和多个值,以动态 output 进行筛选,但它会多次重复查询表,例如,如果我有 11 个条目,我会得到 3 倍以上的 33 个条目。

目标是通过 product_id 合并 3 个表 product + product_description + product_special。

问题出在名为“名称”的字段中,其中的值通常相似,并且仅通过下一列进行区分,其中声明该产品名称适用于语言 1 或 2 或 3。

我想从产品表 model、价格等中提取数据。

我的资料

product

| product_id | model  | price      |
| ---------- | ----- | ----------- |
| 1          | as123 | 1           |
| 2          | ab123 | 2           |
| 3          | az123 | 3           |

product_description

| product_id | name  | language_id |
| ---------- | ----- | ----------- |
| 1          | apple | 1           |
| 1          | apfel | 2           |
| 1          | pomme | 3           |

product_special

| product_id | price | end_date    |
| ---------- | ----- | ----------- |
| 1          | 9.99  | 2023-12-13  |
| 2          | 1.00  | 2023-12-12  |
| 3          | 99.00 | 2023-12-12  |

我尝试加入、联合、组等似乎无法理解如何联合查询,所以 #### 一个产品的结果在一个数组中而不是多个数组中。

我正在使用 PHP 7.4 和 MySQL 5.7.39。

我对 SQL 和开发还很陌生,所以请不要判断得太苛刻。

这是我到目前为止得到的:

    (array) [253 elements]
0: 
(array) [4 elements]
product_id: (string) "9"
model: (string) "HP EliteBook 840 G5 Silver"
name: (string) "Oneplus Nord CE 5G 8GB/128GB Blue EU"
language_id: (string) "3"
1: 
(array) [4 elements]
product_id: (string) "9"
model: (string) "HP EliteBook 840 G5 Silver"
name: (string) "Oneplus Nord CE 5G 8GB/128GB Blue EU"
language_id: (string) "2"
2: 
(array) [4 elements]
product_id: (string) "9"
model: (string) "HP EliteBook 840 G5 Silver"
name: (string) "Motorola Moto G71 5G DS 6GB/128GB Balck EU"
language_id: (string) "3"

注意:由于名为“name”的字段将查询结果重复 x name 次

通过运行此查询命令:

SELECT DISTINCT
    product.product_id,
    product.model,
    product_description.name, 
    product_description.language_id
FROM 
    product  
JOIN 
    product_description ON product.product_id = product_description.product_id
                        AND product_description.language_id = 1
                         OR product_description.language_id = 2
                         OR product_description.language_id = 3
ORDER BY 
    product.product_id;

我想得到的例子:

 0: 
 (array) [2 elements]
 name1: (string) "HP EliteBook 840 G5 Silver"
 name2: (string) "HP EliteBook 840 G5 Silver"
 name3: (string) "HP EliteBook 840 G5 Silver"
 product_id: (string) "9"
 1: 
 (array) [2 elements]
 name1: (string) "Lenovo ThinkPad P52s 20LB000HPB" 
 name2: (string) "Lenovo ThinkPad P52s 20LB000HPB"
 name3: (string) "Lenovo ThinkPad P52s 20LB000HPB"
 product_id: (string) "11"

编辑:我的问题是结果重复了 3 次(每种语言)。 我想加入他们,然后使用类似语言 id 为 1 的地方命名为语言 1,语言 id = 2 为语言 2(我正在为每个产品获取 assoc 数组)这就是为什么在一个结果下,而不是 3 次。我尝试通过以下方式订购id 但在语言表中,主键不同所以我得到一个错误,我不能按 id 排序连接结果,因为它是未聚合的。

你想要所有 3 个名字? 您必须参加 3 次,每次参加一次

SELECT 
    p.product_id,
    p.model,
    name1.name as name1, 
    name2.name as name2, 
    name3.name as name3
FROM product p 
LEFT JOIN product_description name1 ON p.product_id = name1.product_id AND name1.language_id = 1
LEFT JOIN product_description name2 ON p.product_id = name2.product_id AND name2.language_id = 2
LEFT JOIN product_description name3 ON p.product_id = name3.product_id AND name3.language_id = 3
ORDER BY p.product_id;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM