Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 我们可以对同一表中的多个列使用FIND_IN_SET()函数吗_Mysql_Sql_Database Administration_Find In Set - Fatal编程技术网

Mysql 我们可以对同一表中的多个列使用FIND_IN_SET()函数吗

Mysql 我们可以对同一表中的多个列使用FIND_IN_SET()函数吗,mysql,sql,database-administration,find-in-set,Mysql,Sql,Database Administration,Find In Set,注意:我尝试了许多SF解决方案,但没有一个对我有效。这对我们来说有点挑战,任何帮助都将不胜感激 下面是我的SQL Fiddle链接: 我有以下表格: 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)

注意:我尝试了许多SF解决方案,但没有一个对我有效。这对我们来说有点挑战,任何帮助都将不胜感激

下面是我的SQL Fiddle链接:

我有以下表格:

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');
我想要的是:

  • 连接以上两个表以获取(NTO和nCcs)列中的全名

  • 另外,我需要行的总计数()

  • 我尝试的是下面的查询,但在“NTO和nCcs列”中获得倍数时间全名也请建议找到正确的行数

     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的字符串操作能力非常差
    • 在上的
      中使用函数和类型转换通常会阻止索引的使用
    毫无疑问,还有其他很好的理由。您的数据模型应该为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;
    

    是一个数据小提琴。

    请看,尽管我怀疑其核心是一个糟糕的模式设计问题。()@草莓,我明白了,但我的问题很简单,我不允许分享我真正的表数据。如果你能看到的话,我已经非常接近我的任务了。另外,如果可能,请建议可能的更改,我将进行更改。您是否也可以添加您的预期结果?您的查询是否提供了您需要的输出?@Sujitmohanty30需要的是全名而不是“nTos&nCcs”列中的“ID”,我还粘贴了SQL FIDLE链接,您好,首先感谢您的回复和建议。我真的很感激你的宝贵反馈,我会在接下来的查询中使用它。第二个@Akina在评论中解决了我的问题。我对这个我的SQL很陌生。您能告诉我如何在INT数据类型中插入逗号分隔的数字吗?@sober。我想你应该问一个新问题。