我们可以对同一 table 中的多个列使用 FIND_IN_SET() 函数吗
Can we use FIND_IN_SET() function for multiple column in same table
注意:我尝试了很多 SF 解决方案,但 none 对我有用。这有点挑战性,任何帮助将不胜感激。
下面是我的 SQL-Fiddle link : http://sqlfiddle.com/#!9/6daa20/9
我有以下表格:
CREATE TABLE `tbl_pay_chat` (
nId int(11) NOT NULL AUTO_INCREMENT,
npayid int(11) NOT NULL,
nSender int(11) NOT NULL,
nTos varchar(255) binary DEFAULT NULL,
nCcs varchar(255) binary DEFAULT NULL,
sMailBody varchar(500) binary DEFAULT NULL,
PRIMARY KEY (nId)
)
ENGINE = INNODB,
CHARACTER SET utf8,
COLLATE utf8_bin;
INSERT INTO tbl_pay_chat
(nId,npayid,nSender,nTos,nCcs,sMailBody)
VALUES
(0,1,66,'3,10','98,133,10053','Hi this test maail'),
(0,1,66,'3,10','98,133,10053','test mail received');
_____________________________________________________________
CREATE TABLE `tbl_emp` (
empid int(11) NOT NULL,
fullname varchar(45) NOT NULL,
PRIMARY KEY (empid)
)
ENGINE = INNODB,
CHARACTER SET utf8,
COLLATE utf8_bin;
INSERT INTO `tbl_emp` (empid,fullname)
VALUES
(3, 'Rio'),
(10, 'Christ'),
(66, 'Jack'),
(98, 'Jude'),
(133, 'Mike'),
(10053, 'James');
我想要什么:
加入两个表以获取 (nTos & nCcs) 列中的全名。
此外,我想要总 COUNT() 行。
我尝试的是下面的查询,但在 'nTos and nCcs column' 中得到了多次 FULLNAME 也请建议找到正确的行数。
SELECT a.nId, a.npayid, e1.fullname AS nSender, sMailBody, GROUP_CONCAT(b.fullname ORDER BY b.empid)
AS nTos, GROUP_CONCAT(e.fullname ORDER BY e.empid) AS nCcs
FROM tbl_pay_chat a
INNER JOIN tbl_emp b
ON FIND_IN_SET(b.empid, a.nTos) > 0
INNER JOIN tbl_emp e
ON FIND_IN_SET(e.empid, a.nCcs) > 0
JOIN tbl_emp e1
ON e1.empid = a.nSender
GROUP BY a.nId ORDER BY a.nId DESC;
我希望我表达清楚了。请帮忙。
你的数据模型很糟糕。您不应该将 ID 列表存储在字符串中。为什么?以下是一些原因:
- 数字应该存储为数字而不是字符串。
- 应使用外键关系声明表之间的关系。
- SQL 字符串操作能力很差。
- 在
ON
中使用函数和类型转换经常妨碍索引的使用。
毫无疑问,还有其他充分的理由。您的数据模型应该为 n-m 关系使用正确声明的联结表。
就是说,有时我们会受制于其他人非常、非常、非常、非常糟糕的设计决策。有一些方法可以解决这个问题。我认为你想要的查询可以表示为:
SELECT pc.nId, pc.npayid, s_e.fullname AS nSender, pc.sMailBody,
GROUP_CONCAT(DISTINCT to_e.fullname ORDER BY to_e.empid)
AS nTos,
GROUP_CONCAT(DISTINCT cc_e.fullname ORDER BY cc_e.empid) AS nCcs
FROM tbl_pay_chat pc INNER JOIN
tbl_emp to_e
ON FIND_IN_SET(to_e.empid, pc.nTos) > 0 INNER JOIN
tbl_emp cc_e
ON FIND_IN_SET(cc_e.empid, pc.nCcs) > 0 JOIN
tbl_emp s_e
ON s_e.empid = pc.nSender
GROUP BY pc.nId
ORDER BY pc.nId DESC;
Here 是一个 db<>fiddle.
注意:我尝试了很多 SF 解决方案,但 none 对我有用。这有点挑战性,任何帮助将不胜感激。
下面是我的 SQL-Fiddle link : http://sqlfiddle.com/#!9/6daa20/9
我有以下表格:
CREATE TABLE `tbl_pay_chat` (
nId int(11) NOT NULL AUTO_INCREMENT,
npayid int(11) NOT NULL,
nSender int(11) NOT NULL,
nTos varchar(255) binary DEFAULT NULL,
nCcs varchar(255) binary DEFAULT NULL,
sMailBody varchar(500) binary DEFAULT NULL,
PRIMARY KEY (nId)
)
ENGINE = INNODB,
CHARACTER SET utf8,
COLLATE utf8_bin;
INSERT INTO tbl_pay_chat
(nId,npayid,nSender,nTos,nCcs,sMailBody)
VALUES
(0,1,66,'3,10','98,133,10053','Hi this test maail'),
(0,1,66,'3,10','98,133,10053','test mail received');
_____________________________________________________________
CREATE TABLE `tbl_emp` (
empid int(11) NOT NULL,
fullname varchar(45) NOT NULL,
PRIMARY KEY (empid)
)
ENGINE = INNODB,
CHARACTER SET utf8,
COLLATE utf8_bin;
INSERT INTO `tbl_emp` (empid,fullname)
VALUES
(3, 'Rio'),
(10, 'Christ'),
(66, 'Jack'),
(98, 'Jude'),
(133, 'Mike'),
(10053, 'James');
我想要什么:
加入两个表以获取 (nTos & nCcs) 列中的全名。
此外,我想要总 COUNT() 行。
我尝试的是下面的查询,但在 'nTos and nCcs column' 中得到了多次 FULLNAME 也请建议找到正确的行数。
SELECT a.nId, a.npayid, e1.fullname AS nSender, sMailBody, GROUP_CONCAT(b.fullname ORDER BY b.empid)
AS nTos, GROUP_CONCAT(e.fullname ORDER BY e.empid) AS nCcs
FROM tbl_pay_chat a
INNER JOIN tbl_emp b
ON FIND_IN_SET(b.empid, a.nTos) > 0
INNER JOIN tbl_emp e
ON FIND_IN_SET(e.empid, a.nCcs) > 0
JOIN tbl_emp e1
ON e1.empid = a.nSender
GROUP BY a.nId ORDER BY a.nId DESC;
我希望我表达清楚了。请帮忙。
你的数据模型很糟糕。您不应该将 ID 列表存储在字符串中。为什么?以下是一些原因:
- 数字应该存储为数字而不是字符串。
- 应使用外键关系声明表之间的关系。
- SQL 字符串操作能力很差。
- 在
ON
中使用函数和类型转换经常妨碍索引的使用。
毫无疑问,还有其他充分的理由。您的数据模型应该为 n-m 关系使用正确声明的联结表。
就是说,有时我们会受制于其他人非常、非常、非常、非常糟糕的设计决策。有一些方法可以解决这个问题。我认为你想要的查询可以表示为:
SELECT pc.nId, pc.npayid, s_e.fullname AS nSender, pc.sMailBody,
GROUP_CONCAT(DISTINCT to_e.fullname ORDER BY to_e.empid)
AS nTos,
GROUP_CONCAT(DISTINCT cc_e.fullname ORDER BY cc_e.empid) AS nCcs
FROM tbl_pay_chat pc INNER JOIN
tbl_emp to_e
ON FIND_IN_SET(to_e.empid, pc.nTos) > 0 INNER JOIN
tbl_emp cc_e
ON FIND_IN_SET(cc_e.empid, pc.nCcs) > 0 JOIN
tbl_emp s_e
ON s_e.empid = pc.nSender
GROUP BY pc.nId
ORDER BY pc.nId DESC;
Here 是一个 db<>fiddle.