如何从2个不同的表中获取一列

时间:2014-01-29 06:37:19

标签: mysql sql

我在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 */;

这是sqlfiddle

2 个答案:

答案 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(',');

您可以使用

registerSmsUsersGroupsSMS中搜索相应的手机号码
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 ...