我在MySQL registerSMSusers 和 GroupsSMS 中有2个表。这两个表都有一个名为 mobile 的列。从HTML表单我得到逗号分隔值test,alltest,john
。这些逗号分隔值将出现在2个表中的任何一个中。例如测试(名称列)出现在 registerSMSusers 中, alltest 出现在 GroupsSMS (GroupName列)中。
在Java中,我可以用逗号分割,然后检查它是否存在于任何表中。如果存在,则获取移动设备。只是想知道有没有相同的SQL查询。
这是SQL架构
DROP TABLE IF EXISTS `GroupsSMS`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `GroupsSMS` (
`Name` varchar(50) DEFAULT NULL,
`email` varchar(50) DEFAULT NULL,
`mobile` varchar(20) DEFAULT NULL,
`GroupName` varchar(20) DEFAULT NULL,
`GroupID` int(11) NOT NULL AUTO_INCREMENT,
`dataselected` varchar(50) DEFAULT NULL,
PRIMARY KEY (`GroupID`)
) ENGINE=MyISAM AUTO_INCREMENT=191 DEFAULT CHARSET=latin1;
DROP TABLE IF EXISTS `registerSmsUsers`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `registerSmsUsers` (
`name` varchar(50) DEFAULT NULL,
`email` varchar(50) DEFAULT NULL,
`mobile` varchar(20) DEFAULT NULL,
`uid` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`uid`),
UNIQUE KEY `mobile` (`mobile`),
UNIQUE KEY `email` (`email`)
) ENGINE=MyISAM AUTO_INCREMENT=83 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
答案 0 :(得分:1)
MySQL没有用于拆分CSV字符串的现成功能。您必须使用SUBSTRING
或使用SUBSTRING_INDEX
使用REGEXP
手动执行此操作。
查看类似问题的详细信息here
说完将CSV拆分为存储在表格'CSVTable'{id,strvalue}中的实际字符串后,您可以查看
SELECT G.mobile as mobilenumber
FROM 'GroupsSMS' G LEFT JOIN 'CSVTable' C
on G.GroupName =C.strvalue
WHERE C.strvalue is NOT NULL
UNION
SELECT R.mobile as mobilenumber
FROM 'registerSMSusers' R LEFT JOIN 'CSVTable' C
on R.name=C.strvalue
WHERE C.strvalue is NOT NULL
注意我没有使用UNION ALL
来获取不同的设置值
将值输入临时表的伪代码
DECLARE @CSVTABLE TABLE ( id int not null, strvalue NVARCHAR(400) NOT NULL)
DECLARE @var int
SET @var=1
DECLARE @STREXP NVARCHAR(MAX)
DECLARE @BUFF NVARHCAR(400)
SET @BUFF=SUBSTRING_INDEX(@STREXP,',',1)
SET @STREXP=REPLACE(@STREXp,@BUFF+',','')
WHILE @BUFF IS NOT NULL DO
INSERT INTO @temp VALUES(@var,@BUFF)
@var=@var+1
@VUFF
END WHILE
答案 1 :(得分:1)
我已经在Java中分割了字符串
String names[] = csv.split(',');
您可以使用
在registerSmsUsers
或GroupsSMS
中搜索相应的手机号码
PreparedStatement stmt = conn.prepareStatment("select u.mobile from registerSmsuser u where u.name = ? union select g.mobile from GroupsSMS g where g.groupname = ?");
stmt.setString(1, names[0]);
stmt.setString(2, names[0]);
ResultSet rs = stmt.executeQuery();
if (rs.first()) {
// do something with the mobile number
}
这将从用户和组表中选择条目。如果您需要知道号码的来源,您可以在选择
中添加固定字符串select u.mobile, 'user' as origin from registerSmsuser u ...
union
select g.mobile, 'groups' as origin from GroupsSMS g ...