商品表 goods 有学校字段 school_ids

学校字段 school_ids 中保存学校表 school 的id,如果商品包含多个学校则多个id使用逗号分隔保存

school:
在这里插入图片描述
goods:
在这里插入图片描述

最终查询:两个表关联,goods表中字段中school_ids 逗号隔开和school表中的id关联

MySQL版:

SELECT g.id,g.school_ids,GROUP_CONCAT(s.locality_name) 
FROM goods g LEFT JOIN school s ON FIND_IN_SET(s.id , g.school_ids)
GROUP BY g.id
ORDER BY g.id ASC

运行结果
在这里插入图片描述
解释:
concat_ws()函数
该函数将分组中的非NULL值串联起来称为一个字符串。如果分组中的某个值为NULL,而串联的结果为NULL。
自己理解:将多个字符串连接成一个字符串,中间用逗号隔开

语法GROUP_CONCAT(expr)
例子:
在这里插入图片描述

FIND_IN_SET函数
语法:FIND_IN_SET(str,strlist)

  1. 假如字符串str在由N子链组成的字符串列表strlist中,则返回值的范围在1到N之间。
  2. 一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串。
  3. 如果第一个参数是一个常数字符串,而第二个是typeSET列,则FIND_IN_SET()函数被优化,使用比特计算。
  4. 如果str不在strlist或strlist为空字符串,则返回值为0。
  5. 如任意一个参数为NULL,则返回值为NULL。这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行。
    strlist:一个由英文逗号“,”链接的字符串,例如:“a,b,c,d”,该字符串形式上类似于SET类型的值被逗号给链接起来。
    示例:SELECT FIND_IN_SET(‘b’,‘a,b,c,d’); //返回值为2,即第2个值
    个人理解:比如一个字段中信息用逗号隔开,在关联表时,他可以拆分逗号一个一个去和被关联表的字段比较

PostgreSQL版:

SELECT g.id,g.school_ids,string_agg(s.locality_name,',')
FROM goods g LEFT JOIN school s ON s.id = ANY(STRING_TO_ARRAY(g.school_ids, ',')) 
GROUP BY g.id,g.school_ids
ORDER BY g.id ASC

解释
string_agg函数
语法string_agg(字段,',')
定义和上面的mysql相似concat_ws

ANY函数
语法:ANY(STRING_TO_ARRAY(字段, ','))
定义和上面的mysql相似FIND_IN_SET

商品表 goods 有学校字段 school_ids学校字段 school_ids 中保存学校表 school 的id,如果商品包含多个学校则多个id使用逗号分隔保存school:goods:最终查询:两个表关联,goods表中字段中school_ids 逗号隔开和school表中的id关联MySQL版:SELECT g.id,g.school_ids,GROUP_CONCAT(s... select account_id, substring_index(substring_index(a.related_shop_ids,',' ,b.help_topic_id+1),',',-1) shopid sales_hang_account a mysql.help_topic b on b.help_topic_id < (length(a.related_shop_ids) - length(replace(a.related_shop_ids,',',''))+1
下面两个函数的使用和FIND_IN_SET一样,使用时只需要把FIND_IN_SET换成FIND_PART_IN_SET或FIND_ALL_PART_IN_SET 例如某字段里是为1,2,3,4,5  使用方法: 第一种,传入1,3,6  可以查出来 select * from XXX where FIND_PART_IN_SET('1,3,6','1,2,3,4,5') 第二种,传入1,3,6  查不出来 select * from XXX where FIND_ALL_PART_IN_SET('1,3,6','1,2,3,4,5') 第一种:只要包含其中一个就可以被查出来
Bluemix 提供了MySQLPostgreSQL的数据库服务,用户可以直接调用数据库,带来了使用上的便利,但用户目前在 Bluemix上无法作为管理员直接管理数据库。本文主要介绍如何在Bluemix的云平台上管理您的数据库。Bluemix并没有提供一个方案用来在线管理您创建的数据库,如MySQLPostgreSQL 等。当用户在Bluemix上创建了数据库,我们需要一个解决方案去在线管理数据库。本文
select a.title,captionSign,GROUP_CONCAT(c.`name`) as 'aa' from article a join caption c on FIND_IN_SET(c.id,a.captionSign) group by a.id; 注意:group by a.id; GROUP_CONCAT()这...
逗号拼接的id做拆分做一张临时表出来 select a.ID, substring_index(substring_index(a.users, ',', b.help_topic_id + 1), ',', -1) users from `order` a join mysql.he.
关于mysql一个字段存储,多条规则数据需要分割的查询,或者查询插入的写法 SELECT a.id, IFNULL(SUBSTRING_INDEX(SUBSTRING_INDEX(a.[需要分割列名],',',helpTopic.help_topic_id+1),[分割字符,比如:,],-1),'') FROM [TABLE_NAME] a left join mysql.help_topic helpTopic on helpTopic.help_topic_id < (LENGTH(a.[需要分割
inner join(等值连接) : 只返回两个表中联结字段相等的记录 left join(左联接) :返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) :返回包括右表中的所有记录和左表中联结字段相等的记录 INNER JOIN 语法:  INNER JOIN 连接两个数据表的用法: SELECT * FROM 表1 INNER JO
PostgreSQL 中,LEFT JOIN、RIGHT JOIN 和 INNER JOIN 是不同类型的表连接操作,它们之间的区别如下: 1. INNER JOIN:内连接是最常见的表连接类型。它返回两个表中满足连接条件的行。只有在连接条件成立时,两个表中的行才会被合并到结果集中。如果没有匹配的行,则不会包含在结果中。 2. LEFT JOIN:左连接返回左边表中的所有行,以及与右边表匹配的行,如果没有匹配的行,则右边表的列将包含 NULL 值。左连接关键字是 `LEFT JOIN` 或 `LEFT OUTER JOIN`。 3. RIGHT JOIN:右连接返回右边表中的所有行,以及与左边表匹配的行,如果没有匹配的行,则左边表的列将包含 NULL 值。右连接关键字是 `RIGHT JOIN` 或 `RIGHT OUTER JOIN`。 简而言之,INNER JOIN 仅返回两个表中匹配的行,LEFT JOIN 返回左表中的所有行以及与右表匹配的行,RIGHT JOIN 返回右表中的所有行以及与左表匹配的行。 以下是一个示例,展示了这三种连接类型之间的区别。假设你有两个表:`orders` 和 `customers`。 orders 表: | order_id | customer_id | |----------|-------------| | 1 | 101 | | 2 | 102 | | 3 | 103 | customers 表: | customer_id | customer_name | |-------------|---------------| | 101 | John | | 103 | Sarah | | 104 | Emma | 使用以下查询来进行不同类型的连接操作: 1. INNER JOIN: ```sql SELECT orders.order_id, customers.customer_name FROM orders INNER JOIN customers ON orders.customer_id = customers.customer_id; | order_id | customer_name | |----------|---------------| | 1 | John | | 3 | Sarah | 2. LEFT JOIN: ```sql SELECT orders.order_id, customers.customer_name FROM orders LEFT JOIN customers ON orders.customer_id = customers.customer_id; | order_id | customer_name | |----------|---------------| | 1 | John | | 2 | NULL | | 3 | Sarah | 3. RIGHT JOIN: ```sql SELECT orders.order_id, customers.customer_name FROM orders RIGHT JOIN customers ON orders.customer_id = customers.customer_id; | order_id | customer_name | |----------|---------------| | 1 | John | | 3 | Sarah | | NULL | Emma | 希望这个示例能够帮助你理解 LEFT JOIN、RIGHT JOIN 和 INNER JOIN 之间的区别。