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

tp5buhyn  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(304)

我有以下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 名称,但我不知道如何编写正确的联接来实现这一点:

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:
@戴相龙在下面发表了有效的评论。
您的示例数据输出没有显示当单个产品有多个标记时您希望如何获取数据
对于具有多个标记的单个产品,我只需要与行的字符串匹配的标记 images.alt 数据。alt数据遵循以下模式: [color || material] - Swatch . 标记数据遵循以下字符串模式: [type]:[value] .
字符串比较应与 [color || material] 部分 image.alt 数据和右边的结肠 [value] 一边,一边 tags.tag 数据。

cbjzeqam

cbjzeqam1#

你在正确的轨道上-两个内部连接。
问:这个查询会发生什么:

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内部联接—从两个或多个表中查询数据
我做了一个额外的改变:我正在全面使用“images.product\u id”。
它应该返回“alt”文本、产品id、图像源和每个正在使用的图像的标签 LIKE "%Swatch%" 以及 IN ("2112055640177","2112056590449","2112055378033","2112062292081","2112058490993","2112062619761","2112062488689","2112066420849","2112061833329","2112052527217") .
如果你有多行。。。这意味着你有重复的图像。
如果标签为空,则表示该产品id没有标签。
如果没有看到预期的标记,则表示没有与“where”子句匹配的图像。
您可以通过复制/粘贴一个简单的“选择”来验证3、4或5中的任何一个。
希望有帮助。。。
问:为什么需要加入产品表?什么(如果有的话)是你的“产品”所独有的?

相关问题