繁体   English   中英

SQL左联接具有多个值

[英]SQL Left join with multiple values

我有一个非常老的数据库,表结构真的很差,我试图用更好的结构创建这些表。 为此,我需要匹配两个表以获取类别的ID。

这是我的两个旧桌子:

表格类别:

| ID |  catname     |  cat1  |    cat2     |   cat3  | cat4 |
+----+--------------+--------+-------------+---------+------+
|  1 |  bike        |  bike  | NULL        | NULL    | NULL |
|  2 |  accessories |  bike  | accessories | NULL    | NULL |
|  3 |  helmets     |  bike  | accessories | helmets | NULL |
|  4 |  lights      |  bike  | accessories | lights  | NULL |
|  5 |  led         |  bike  | accessories | lights  | led  |

餐桌产品:

| ID |  productnr  |  productname  | cat1  |    cat2     |   cat3  | cat4 |
+----+-------------+---------------+-------+-------------+---------+------+
|  1 |  451157     |  productya    |  bike | accessories | NULL    | NULL |
|  2 |  555523     |  product11    |  bike | accessories | helmets | NULL |
|  3 |  234432     |  helmetxqa    |  bike | accessories | helmets | NULL |
|  4 |  666623     |  lightblue    |  bike | accessories | lights  | NULL |
|  5 |  542123     |  foobarlight  |  bike | accessories | lights  | led  |

首先,我想删除products表中的cat1、2、3和4列。

这样我就得到了这样的结果:

| ID |  catId  | productnr  |  productname  |
+----+---------+------------+---------------+
|  1 |  2      | 451157     |  productya    |
|  2 |  3      | 555523     |  product11    |
|  3 |  3      | 234432     |  helmetxqa    |
|  4 |  4      | 666623     |  lightblue    |
|  5 |  5      | 542123     |  foobarlight  |

有人可以告诉我,我该如何进行查询以检查所有4只猫是否都匹配,然后给我这个cat'id? 我已经尝试过这种方法,但是我认为这是错误的方法,因为每次产品只有2或3个猫时,我都不会获得相关的catId。 因此,它仅适用于定义了所有4种猫的产品。

SELECT
    cat.`id`,
    prod.`productnr`,
    prod.`productname`
FROM
    products as prod
LEFT JOIN
    categorys as cat
ON
    cat.`cat1` = prod.`cat1`
AND
    cat.`cat2` = prod.`cat2`
AND
    cat.`cat3` = prod.`cat3`
AND
    cat.`cat4` = prod.`cat4`

如果有人对我也有用的小费,请告诉我。 ;-)

谢谢你的协助 :)

您可以通过对每种类别的组合进行单独的联接来解决此问题。 当然,这是一个分层排名,您不希望重复。 因此,以下将执行这些检查:

SELECT prod.id, coalesce(c4.id, c3.id, c2.id, c1.id) as catid
       prod.`productnr`, prod.`productname`
FROM products prod left join
     categorys c4
     on c4.cat1 = prod.cat1 and c4.cat2 = prod.cat2 and
        c4.cat3 = prod.cat3 and c4.cat4 = prod.cat4 left join
     categorys c3
     on c3.cat1 = prod.cat1 and c3.cat2 = prod.cat2 and
        c3.cat3 = prod.cat3 and c3.cat4 is null and
        c4.id is null left join
     categorys c2
     on c2.cat1 = prod.cat1 and c2.cat2 = prod.cat2 and c2.cat3 is null and
        c3.id is null and c4.id is null left join
     categorys c1
     on c1.cat1 = prod.cat1 and c1.cat2 is null and
        c2.id is null and c3.id is null and c4.id is null;

在某些情况下,这可能会产生重复的行(尽管这样做可以避免这种情况)。 如果发生这种情况,则可能仍然需要group by

首先,您需要适当的数据模型。

分类:

| ID |  catname     |
+----+--------------+

产品:

| ID |  productnr  |  productname  |
+----+-------------+---------------+

和哦,魔术连接表:

|ID | product_id | category_id|
+---+------------+------------+

现在,您可以正确地要求数据库为您提供数据了

SELECT
    cat.`id`,
    prod.`productnr`,
    prod.`productname`

FROM categories as cat

INNER JOIN products2categories p2c
ON p2c.category_id = cat.id

INNER JOIN products prod 
ON p2c.product_id = prod.id

由于我真的不喜欢分发完整的复制粘贴示例,因此我将让您使用上面的查询来检查如何找到存在4个类别的产品。 请记住-最简单的方法通常总是正确的方法。

问题可能是您的表中为null,因为在SQL中null!= null

要解决该问题,您可以合并数据

SELECT
    cat.`id`,
    prod.`productnr`,
    prod.`productname`
FROM
    products as prod
LEFT JOIN
    categorys as cat
ON
    coalesce(cat.`cat1`,'No Value') = coalesce(prod.`cat1`,'No Value')
AND
    coalesce(cat.`cat2`,'No Value') = coalesce(prod.`cat2`,'No Value')
AND
   coalesce(cat.`cat3`,'No Value') = coalesce(prod.`cat3`,'No Value')
AND
    coalesce(cat.`cat4`,'No Value') = coalesce(prod.`cat4`,'No Value')

如果要在每个cat字段都加入时仅获取id ,请尝试使用INNER JOIN而不是LEFT JOIN

SELECT
    cat.`id`,
    prod.`productnr`,
    prod.`productname`
FROM
    products as prod
INNER JOIN
    categorys as cat
ON
    cat.`cat1` = prod.`cat1`
AND
    cat.`cat2` = prod.`cat2`
AND
    cat.`cat3` = prod.`cat3`
AND
    cat.`cat4` = prod.`cat4`

暂无
暂无

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

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