mysql - 当一列有前缀时连接表

标签 mysql select

这是我的“产品”表其中 sku RLIKE 'IP-205-1067-16' 或 sku IN ('205-d-SC55G','205-d-RC099G','205-d- SC45G','205-d-RC099G'):

+---------------------------+---------+-----------------------+-----------------------+-------------------------+----------------------------+
|            sku            | price_1 | full_color_imprint_id | embroidery_imprint_id | screen_print_imprint_id | laser_engraving_imprint_id |
+---------------------------+---------+-----------------------+-----------------------+-------------------------+----------------------------+
| IP-205-1067-16            | 1.55556 | NULL                  | NULL                  | 63276                   | 32539                      |
| IP-205-1067-16-39423495   | 1.55556 | NULL                  | NULL                  | 63276                   | 32539                      |
| IP-205-1067-16-1272347    | 1.55556 | NULL                  | NULL                  | 63276                   | 32539                      |
| IP-205-1067-16-56185      | 1.55556 | NULL                  | NULL                  | 63276                   | 32539                      |
| IP-205-1067-16-1706399150 | 1.55556 | NULL                  | NULL                  | 63276                   | 32539                      |
| 205-d-SC45G               | 45      | NULL                  | NULL                  | NULL                    | NULL                       |
| 205-d-SC55G               | 55      | NULL                  | NULL                  | NULL                    | NULL                       |
| 205-d-RC059G              | 0.59    | NULL                  | NULL                  | NULL                    | NULL                       |
| 205-d-RC099G              | 0.99    | NULL                  | NULL                  | NULL                    | NULL                       |
+---------------------------+---------+-----------------------+-----------------------+-------------------------+----------------------------+

这是我的“imprint_locations”表WHERE imprint_method_id IN (63276,32539):

+--------+-------------------+------------+-------------+--------------+
|   id   | imprint_method_id |    name    |  setup_sku  | running_sku  |
+--------+-------------------+------------+-------------+--------------+
| 809128 |             32539 | Body Right | 205-d-SC45G | 205-d-RC059G |
| 809129 |             32539 | Body Left  | 205-d-SC45G | 205-d-RC059G |
| 808288 |             63276 | Body Right | 205-d-SC55G | 205-d-RC099G |
| 808289 |             63276 | Body Left  | 205-d-SC55G | 205-d-RC099G
+--------+-------------------+------------+-------------+--------------+

这是我想要实现的最终结果:

+---------------------------+-----------------------------------------+-------------------------------------------+-------------------------------------------+---------------------------------------------+----------------------------------------------+------------------------------------------------+
|            sku            | embroidery_imprint_id_setup_sku_price_1 | embroidery_imprint_id_running_sku_price_1 | screen_print_imprint_id_setup_sku_price_1 | screen_print_imprint_id_running_sku_price_1 | laser_engraving_imprint_id_setup_sku_price_1 | laser_engraving_imprint_id_running_sku_price_1 |
+---------------------------+-----------------------------------------+-------------------------------------------+-------------------------------------------+---------------------------------------------+----------------------------------------------+------------------------------------------------+
| IP-205-1067-16            | NULL                                    | NULL                                      |                                        55 | 0.99                                        |                                           45 | 0.59                                           |
| IP-205-1067-16-39423495   | NULL                                    | NULL                                      |                                        55 | 0.99                                        |                                           45 | 0.59                                           |
| IP-205-1067-16-1272347    | NULL                                    | NULL                                      |                                        55 | 0.99                                        |                                           45 | 0.59                                           |
| IP-205-1067-16-56185      | NULL                                    | NULL                                      |                                        55 | 0.99                                        |                                           45 | 0.59                                           |
| IP-205-1067-16-1706399150 | NULL                                    | NULL                                      |                                        55 | 0.99                                        |                                           45 | 0.59                                           |
+---------------------------+-----------------------------------------+-------------------------------------------+-------------------------------------------+---------------------------------------------+----------------------------------------------+------------------------------------------------+

您可以看到产品表的 screen_print_imprint_id 与 imprint_locations 表中的 imprint_method_id 相匹配。

最佳答案

您需要使用 imprint_locations 表作为中间关系表,与 product 表连接两次。

您可以对要链接的每个 ID 字段使用单独的联接,也可以使用 MySQL pivot table 中的方法。加入一次并将价格转入适当的列。

SELECT DISTINCT p1.sku, 
    MAX(IF(p1.embroidery_imprint_id = l.imprint_method_id AND p2.sku = l.setup_sku, p2.price_1, NULL)) AS embroidery_imprint_id_setup_sku_price_1,
    MAX(IF(p1.embroidery_imprint_id = l.imprint_method_id AND p2.sku = l.running_sku, p2.price_1, NULL)) AS embroidery_imprint_id_running_sku_price_1,
    MAX(IF(p1.screen_print_imprint_id = l.imprint_method_id AND p2.sku = l.setup_sku, p2.price_1, NULL)) AS screen_print_imprint_id_setup_sku_price_1,
    MAX(IF(p1.screen_print_imprint_id = l.imprint_method_id AND p2.sku = l.running_sku, p2.price_1, NULL)) AS screen_print_imprint_id_running_sku_price_1,
    MAX(IF(p1.laser_engraving_imprint_id = l.imprint_method_id AND p2.sku = l.setup_sku, p2.price_1, NULL)) AS laser_engraving_imprint_id_setup_sku_price_1,
    MAX(IF(p1.laser_engraving_imprint_id = l.imprint_method_id AND p2.sku = l.running_sku, p2.price_1, NULL)) AS laser_engraving_imprint_id_running_sku_price_1
FROM product AS p1
JOIN imprint_locations AS l ON l.imprint_method_id IN (p1.embroidery_imprint_id, p1.screen_print_imprint_id, p1.laser_engraving_imprint_id)
JOIN product AS p2 ON p2.sku IN (l.running_sku, l.setup_sku)
GROUP BY p1.sku

DEMO

关于mysql - 当一列有前缀时连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45427089/

相关文章:

java - 如何通过EC2 SSH隧道从本地JAVA程序连接到RDS

mysql - 返回对用户配置文件的最近访问。 Group-by-N 混淆

javascript - 强制 extjs 组合框至少包含一项?

sql - 从 SQL 中的多个数据库中选择 COUNT()

php - 删除插入到 mysql 中的 post html、js、css

php - 更改php中分页的目标页面

python - 选择选项值不起作用

c# - .NET MySQL 数据读取器选择功能?

mysql - 如何将查询存储到变量中以便我可以使用它两次?

python - 在python中设置默认的日期时间格式