[英]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.