我有以下 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
侧)。
您走在正确的轨道上 - 两个内部连接。
问:此查询会发生什么情况:
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")
换句话说:
仅在相互密钥上加入,然后
根据总体标准进行筛选
对于表中的数据集:
您仍然遇到“重复行”吗?
是否有任何预期的行“丢失”?
如果/当单个产品有多行时会发生什么?
请尝试此查询并使用结果更新您的帖子。
另外:请在此处查看更多建议:
我做了一项额外的更改:我全面使用“images.product_id”。
它应该返回每个图像的“alt”文本、产品 ID、图像源和标签,即
LIKE "%Swatch%"
和 IN ("2112055640177","2112056590449","2112055378033","2112062292081","2112058490993","2112062619761","2112062488689","2112066420849","2112061833329","2112052527217")
。
如果您获得多行...这意味着您有重复的图像。
如果标签为空,则表示该产品 ID 没有标签。
如果您没有看到所需的标签,则意味着没有与“WHERE”子句匹配的图像。
您可以通过复制/粘贴简单的“SELECT”来验证 3、4 或 5 中的任何一个。
为什么需要加入产品表? 您正在获取什么(如果有的话)是“产品”独有的?