mysql - 仅返回检查多个连接行的行

标签 mysql

我有一个名为“collections”的表,其中有一个逗号分隔的 id 字段,与另一个名为“inspirations”的表相关。

我想选择包含灵感的集合行,我可以通过 where 子句过滤这些灵感。展示我尝试过的示例可能会更容易:

这是我正在尝试的:

SELECT collections.id,collections.uid,title,inspids,private,collections.tstamp FROM collections
LEFT JOIN inspirations ON "%"+inspirations.id+"%" LIKE inspids
WHERE collections.uid = "54"
AND inspirations.keywords LIKE "%bright%"

除非我删除 AND 部分,否则不会返回任何结果。我需要它返回匹配的结果。我可能误解了 LEFT JOIN,它总是让我感到困惑。我猜测的问题是 LEFT JOIN 返回多行,而我的 WHERE 不知道如何搜索所有行,我是否需要以某种方式执行“搜索所有左连接行”?

或者也许有一种完全不同的方法来实现这一目标?

感谢您提前提供的任何帮助!!


根据@Alpesh Jikadra 的以下要求:

集合表结构:

id, uid, parent, title, inspids, private, collabs, ord, tstamp

灵感表结构:

id, uid, image, filters, caption, keywords, tstamp, thumb, stat_views, hide_from_search, ord

数据示例:

两个表中都有 1000 行,例如:

inspirations 有一行 id 为“123”,关键字为“blabla,bright,yellow,happy”,collections 有一行 inspids 为“2074,123,42”。

我希望只有那些充满灵感且关键字字段中包含“%bright%”的集合才会返回。


这是我用来显示问题的 SQL:sqlfiddle.com/#!9/5a1f90/10

但是非常感谢所有提供帮助的人,以及 Daniel E 分享使用“find_in_set”来解决问题,请注意,我必须添加“GROUP BY collections.id”以仅传递唯一的集合,例如:

SELECT collections.id,collections.uid,title,inspids,private,collections.tstamp FROM collections
LEFT JOIN inspirations ON find_in_set(inspirations.id, collections.inspids) > 0
WHERE collections.uid = "54"
AND inspirations.keywords LIKE "%bright%"
GROUP BY collections.id

最佳答案

您可以使用函数 find_in_set :

SQL Fiddle

MySQL 5.6 架构设置:

CREATE TABLE collections (
id int,
uid int,
parent int,
title varchar(255),
inspids varchar(255),
private int,
collabs varchar(255),
ord int,
tstamp varchar(255)
);

CREATE TABLE inspirations (
id int,
uid int,
image varchar(255),
filters varchar(255),
caption varchar(255),
keywords varchar(255),
tstamp varchar(255)
);

INSERT INTO collections SET id='100', uid='12', title='A collection example', inspids='2742,123,42',private='0',collabs='',ord='0',tstamp='1523272320';
INSERT INTO inspirations SET id='2742', uid='47', keywords='blabla,bright,test';

查询 1:

SELECT collections.id,collections.uid,title,inspids,private,collections.tstamp FROM collections
LEFT JOIN inspirations ON find_in_set(inspirations.id, collections.inspids) > 0
WHERE collections.uid = "12"
AND inspirations.keywords LIKE "%bright%"

<强> Results :

|  id | uid |                title |     inspids | private |     tstamp |
|-----|-----|----------------------|-------------|---------|------------|
| 100 |  12 | A collection example | 2742,123,42 |       0 | 1523272320 |

关于mysql - 仅返回检查多个连接行的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49730697/

相关文章:

mysql - 用户 'username' 访问被拒绝 @'IP' 错误 - digitalocean

php - CodeIgniter PHP MySQL 查询查看

MySQL 我连接到哪个连接?

MySQL : How to declare foreign key inline?

php - mysql关系数据库,关系和逻辑

mysql - 如何在联接表中按日期选择最后一条记录

mysql - 带有 DEFAULT CURDATE() 的日期列抛出错误

mysql - 将列添加到现有的多列索引

php - 如何有效实现新闻通讯系统以防止重复发送电子邮件?

sql - 如何将 mysql 数据库从 Ubuntu 迁移到 Windows?