如何编写SQL语句从交叉引用表中获取匹配的数据?

问题描述 投票:0回答:1

我有以下 SQL(MYSQL 数据库)查询:

SELECT images.alt, images.product_id, images.src
FROM wp_wps_images images
INNER JOIN wp_wps_products products
ON products.product_id = images.product_id
AND products.product_id IN ("2112055640177","2112056590449","2112055378033","2112062292081","2112058490993","2112062619761","2112062488689","2112066420849","2112061833329","2112052527217")
WHERE images.alt LIKE "%Swatch%"

这在返回给我一个如下所示的结果集方面做得很好:

Rust (W) - Swatch   2112058490993   foobar.com
Sand - Swatch   2112058490993   barfoo.com
Tan - Swatch    2112056590449   bazfoo.com
Generic Black - Swatch  2112056590449   tazfoo.com
Patterned / Multi - Swatch  2112055640177   mazfoo.com
Tan - Swatch    2112055640177   bazfoo.com
Generic Black - Swatch  2112055640177   tazfoo.com
Generic Black - Swatch  2112055378033   tazfoo.com
Dark Tobacco - Swatch   2112055378033   makazfoo.com

我有

tags
表,其架构如下所示
id (BIGINT)
tag_id (BIGINT)
product_id (BIGINT)
post_id (BIGINT)
tag (VARCHAR)
。我想加入此表,以便对于所选的图像,我还可以从标签表中读取它们各自的
tag
名称,但我不知道如何编写正确的 JOIN 来实现此目的:

SELECT images.alt, images.product_id, images.src, tags.tag

我希望上面的语句会返回类似的结果:

Rust (W) - Swatch   2112058490993   foobar.com           color:rust
Sand - Swatch   2112058490993   barfoo.com               material:sand
Tan - Swatch    2112056590449   bazfoo.com               color:tan
Generic Black - Swatch  2112056590449   tazfoo.com       color:black
Patterned / Multi - Swatch  2112055640177   mazfoo.com   material:multi
Tan - Swatch    2112055640177   bazfoo.com               color:tan
Generic Black - Swatch  2112055640177   tazfoo.com       color:black
Generic Black - Swatch  2112055378033   tazfoo.com       color:black
Dark Tobacco - Swatch   2112055378033   makazfoo.com     color:dark-tobacco

现在我有类似下面的 SQL 语句,但它并没有让我更接近我的目标:

SELECT images.alt, images.product_id, images.src, tags.tag
FROM wp_wps_images images
INNER JOIN wp_wps_products products
ON products.product_id = images.product_id
AND products.product_id IN ("2112055640177","2112056590449","2112055378033","2112062292081","2112058490993","2112062619761","2112062488689","2112066420849","2112061833329","2112052527217")
INNER JOIN wp_wps_tags tags
ON tags.product_id = products.product_id
AND tags.product_id = images.product_id
AND tags.tag LIKE "%:%"
WHERE images.alt LIKE "%Swatch%"

上面的语句给我带来的结果有很多重复,与我将图像与其标签名称匹配的目标相去甚远。结果是:

Tan - Swatch    2112052527217   bazfoo.com  color:generic-black
Tan - Swatch    2112052527217   bazfoo.com  depth:8
Tan - Swatch    2112052527217   bazfoo.com  height:13
Tan - Swatch    2112052527217   bazfoo.com  material:leather
Tan - Swatch    2112052527217   bazfoo.com  strap:12-1-2
Tan - Swatch    2112052527217   bazfoo.com  style:totes
Tan - Swatch    2112052527217   bazfoo.com  width:19
Generic Black - Swatch  2112052527217   tazfoo.com  color:generic-black
Generic Black - Swatch  2112052527217   tazfoo.com  depth:8

如何为 MYSQL 数据库编写 SQL 语句来返回带有各自标签名称的图像?

编辑1:

@Dai 在下面发表了有效评论。

您的示例数据输出并未显示您希望如何获取数据 一个产品有多个标签

对于具有多个标签的单个产品,我只想要与行的

images.alt
数据的字符串匹配的标签。 alt 数据遵循以下模式:
[color || material] - Swatch
。标签数据遵循以下字符串模式:
[type]:[value]

字符串比较应匹配

[color || material]
数据的
image.alt
部分以及
[value]
数据的冒号右侧(
tags.tag
侧)。

mysql sql
1个回答
0
投票

您走在正确的轨道上 - 两个内部连接。

问:此查询会发生什么情况:

SELECT images.alt, images.product_id, images.src, tags.tag
FROM wp_wps_images images
INNER JOIN wp_wps_products products
ON products.product_id = images.product_id
INNER JOIN wp_wps_tags tags
ON tags.product_id = images.product_id
WHERE images.alt LIKE "%Swatch%"
AND images.product_id IN ("2112055640177","2112056590449","2112055378033","2112062292081","2112058490993","2112062619761","2112062488689","2112066420849","2112061833329","2112052527217")

换句话说:

  1. 仅在相互密钥上加入,然后

  2. 根据总体标准进行筛选

对于表中的数据集:

您仍然遇到“重复行”吗?

是否有任何预期的行“丢失”?

如果/当单个产品有多行时会发生什么?

请尝试此查询并使用结果更新您的帖子。

另外:请在此处查看更多建议:

SQL 内连接 3 个表?

SQL INNER JOIN – 从两个或多个表查询数据


  1. 我做了一项额外的更改:我全面使用“images.product_id”。

  2. 它应该返回每个图像的“alt”文本、产品 ID、图像源和标签,即

    LIKE "%Swatch%"
    IN ("2112055640177","2112056590449","2112055378033","2112062292081","2112058490993","2112062619761","2112062488689","2112066420849","2112061833329","2112052527217")

  3. 如果您获得多行...这意味着您有重复的图像。

  4. 如果标签为空,则表示该产品 ID 没有标签。

  5. 如果您没有看到所需的标签,则意味着没有与“WHERE”子句匹配的图像。

  6. 您可以通过复制/粘贴简单的“SELECT”来验证 3、4 或 5 中的任何一个。

为什么需要加入产品表? 您正在获取什么(如果有的话)是“产品”独有的?

© www.soinside.com 2019 - 2024. All rights reserved.