【问题标题】:SQL UNION with Where clause a result of the first selectSQL UNION with Where 子句是第一次选择的结果
【发布时间】:2014-05-22 11:08:45
【问题描述】:

我需要执行以下查询:

SELECT (COL1,COL2, ClientID)
FROM Jobs
Union
SELECT (ClientID,COL2,COL3)
FROM Clients WHERE (the ClientID= ClientID my first select)

我真的被困住了,我一直在尝试加入和联合,但不知道该怎么做。

*EDIT*查询创建工作表

CREATE TABLE IF NOT EXISTS `jobs` (
  `JobID` int(11) NOT NULL AUTO_INCREMENT,
  `Title` varchar(32) NOT NULL,
  `Trade` varchar(32) NOT NULL,
  `SubTrade` varchar(300) NOT NULL,
  `Urgency` tinyint(4) NOT NULL,
  `DatePosted` int(11) NOT NULL,
  `Description` varchar(500) NOT NULL,
  `Photo` longblob,
  `Photo2` longblob,
  `Address` varchar(600) NOT NULL,
  `ShowAddress` tinyint(4) NOT NULL,
  `ShowExact` tinyint(4) NOT NULL,
  `JobStatus` tinyint(4) NOT NULL,
  `Longitude` double NOT NULL,
  `Latitude` double NOT NULL,
  `ClientID` int(11) NOT NULL,
  `TradesmanID` int(11) DEFAULT NULL,
  PRIMARY KEY (`JobID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=171 ;

创建客户表的查询是

CREATE TABLE IF NOT EXISTS `clients` (
  `ClientID` int(11) NOT NULL AUTO_INCREMENT,
  `FName` varchar(32) NOT NULL,
  `SName` varchar(32) NOT NULL,
  `Email` varchar(32) NOT NULL,
  `HomePhone` int(11) NOT NULL,
  `Mobile` varchar(30) NOT NULL,
  `Address` varchar(100) NOT NULL,
  `County` varchar(32) NOT NULL,
  `PostCode` varchar(32) NOT NULL,
  `UserName` varchar(32) NOT NULL,
  `Password` varchar(32) NOT NULL,
  `NotificationID` varchar(255) NOT NULL,
  PRIMARY KEY (`ClientID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=96 ;

【问题讨论】:

  • 你想达到什么结果?您可以使用 sqlfiddle 创建示例
  • 你能提供更多关于查询应该做什么的数据吗..预期的输出是什么..
  • JOIN 在您的情况下不起作用吗?
  • @AngeloNeuschitzer 我需要获取客户姓名、电子邮件、手机,其中他们的 clientID 也与工作表中的工作相关联。我没有使用 sqlfiddle 的经验
  • 如果你还没有经验,你以后会有。这将使我们能够了解您的表结构并了解您的需求,以便我们可以创建一个产生此结果的查询

标签: mysql sql join union


【解决方案1】:
  SELECT 
Clients.ClientID
,Clients.NotificationID
,Clients.Email
,Clients.Mobile
,Clients.HomePhone 
,Jobs.JobID
,Jobs.Title
,Jobs.Trade
,Jobs.Address               AS JobAddress
,Jobs.Urgency
,Jobs.DatePosted
,Jobs.Description
,Jobs.Photo
,Jobs.Photo2
,Jobs.ShowAddress
,Jobs.ShowExact
,Jobs.JobStatus
    ,Jobs.TradesmanID
    ,Jobs.Longitude
    ,Jobs.Latitude

 FROM
    Clients
 INNER JOIN 
    Jobs
        on Clients.ClientId = Jobs.ClientId

【讨论】:

  • 抱歉,误读了答案,我会试试这个并回复你
  • 根据您的回答,我的查询如下: SELECT Clients.ClientID,Clients.NotificationID,Clients.Email, Clients.Mobile, Clients.HomePhone INNER JOIN (SELECT (JobID, Title, Trade,地址、紧急程度、发布日期、描述、照片、照片 2、ShowAddress、ShowExact、地址、JobStatus、TradesmanID、经度、纬度、ClientID) FROM Jobs) AS A on Clients.ClientId = A.ClientId FROM Clients。这将返回一个 sql 语法错误
  • 对于不同类型的数据库,我们有几个不同的答案。你知道你用的是哪一个吗?在我建议之前需要知道这一点。
  • @Sarin 我正在使用 phpmyadmin
  • 您想要最终答案中的职位信息吗?
【解决方案2】:

这个怎么样?有一些重复,即第二个联合中的 select 子句复制了第一个语句,但它会起作用。

SELECT COL1,COL2, ClientID
FROM Jobs
Union
SELECT ClientID,COL2,COL3
FROM Clients WHERE (Select ClientID FROM Jobs)

【讨论】:

  • 感谢 Srin 的回答,但是这会返回“使用的 SELECT 语句有不同的列数”
  • 听起来像是您的一个选择语句中的列有问题?仔细检查他们?你用的是什么数据库?
  • @Sarain 是否与 where 子句不比较任何内容有关?
  • @user2363025 不是我的专业领域,抱歉!我觉得这个声明没问题。
【解决方案3】:

试试这个:

     SELECT c.ClientID, c.COL2, c.COL3, x.col1
        FROM Clients c inner join 
                         (select clientId, 
                                 min(col1) as col1 
                          from jobs 
                          group by clientId) x
           on c.clientId = x.clientId

【讨论】:

  • 标准 SQL 在语句的结尾而不是开头需要语句终止字符(;)。
  • @a_horse_with_no_name,我明白了,但是当我为 sql-server 编写代码并使用 CTE 时,这是该命令的样式和语法
  • 不,这不是“此命令的语法”——这是一个很大的误解。您只需确保正确终止 previous 语句。您可能想阅读以下内容:sqlblog.com/blogs/aaron_bertrand/archive/2012/09/25/16567.aspx
  • 是的,在某些方面你是对的。感谢您的提示:)
猜你喜欢
  • 2016-04-10
  • 1970-01-01
  • 2023-03-22
  • 2021-08-04
  • 1970-01-01
  • 2011-08-07
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多