2010-03-04 77 views
2

这里是我的工作查询:如何编写此MySQL查询以获取正确的信息? (子查询,多个子查询)

SELECT `unitid`, `name` FROM apartmentunits 
WHERE aptid = (
    SELECT `aptid` FROM rentconditionsmap WHERE rentcondid = 1 AND condnum = 1 
) 

我有麻烦搞清楚是怎么写的这个添加更多rentcondition限制器向下搜索结果进行过滤这个名单是什么。

SELECT `aptid` FROM rentconditionsmap WHERE rentcondid = 1 AND condnum = 1 

数据:

CREATE TABLE IF NOT EXISTS `rentconditionsmap` (
    `rcid` bigint(10) unsigned NOT NULL AUTO_INCREMENT, 
    `rentcondid` int(3) unsigned NOT NULL, 
    `condnum` tinyint(3) unsigned NOT NULL, 
    `aptid` bigint(10) unsigned DEFAULT NULL, 
    PRIMARY KEY (`rcid`), KEY `aptid` (`aptid`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=18 ; 

INSERT INTO `rentconditionsmap` 
    (`rcid`, `rentcondid`, `condnum`, `aptid`) 
VALUES 
    (1, 1, 1, 1), 
    (2, 2, 1, 1), 
    (3, 3, 0, 1), 
    (4, 4, 1, 1), 
    (5, 8, 0, 1); 

CREATE TABLE IF NOT EXISTS `apartmentunits` (
    `unitid` bigint(10) NOT NULL AUTO_INCREMENT, 
    `aptid` bigint(10) NOT NULL, 
    `name` varchar(6) NOT NULL, 
    `verified` tinyint(1) NOT NULL DEFAULT '0', 
    `rentcost` int(4) unsigned DEFAULT NULL, 
    `forrent` tinyint(1) NOT NULL DEFAULT '0', 
    `unittypekey` varchar(2) DEFAULT NULL, 
    `sqft` smallint(6) DEFAULT NULL, 
    PRIMARY KEY (`unitid`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=121 ; 

INSERT INTO `apartmentunits` 
    (`unitid`, `aptid`, `name`, `verified`, `rentcost`, `forrent`, `unittypekey`, `sqft`) 
VALUES 
    (1, 1, '3', 1, 540, 0, '2B', NULL), 
    (2, 1, '5', 1, NULL, 0, '2B', NULL), 
    (3, 1, '7', 1, NULL, 0, '2B', NULL), 
    (53, 1, '1', 1, NULL, 0, '2B', NULL), 
    (54, 1, '2', 1, NULL, 0, '2B', NULL), 
    (55, 1, '4', 1, 570, 0, '2B', NULL), 
    (56, 1, '6', 1, NULL, 0, '2B', NULL), 
    (57, 1, '8', 1, NULL, 0, '2B', NULL), 
    (58, 1, '9', 1, NULL, 0, '2B', NULL), 
    (59, 1, '10', 1, NULL, 0, '2B', NULL), 
    (60, 1, '11', 1, NULL, 0, '2B', NULL); 
+0

您的子查询将始终为满足您的WHERE子句的所有记录返回字面值'aptid'。那是你要的吗? – flayto 2010-03-04 18:18:34

+3

尝试更改=到IN – 2010-03-04 18:18:43

+1

@flayto - 不,它不会。 backtick是mysql中的标识符引用char。 – 2010-03-04 18:25:20

回答

1

正如埃里克·J表示为注释:

尝试改变=到IN

SELECT `unitid`, `name` FROM apartmentunits 
WHERE `aptid` IN (
    SELECT `aptid` FROM rentconditionsmap WHERE rentcondid = 1 AND condnum = 1 
) 
+0

但是,这只涉及限制一套租金条件。我需要能够查询多个集合来限制返回的单元。 – 2010-03-04 18:28:27

+1

当然,但它是答案,这就是为什么我添加它。如果您需要更多,只需将OR子句添加到WHERE。 '在哪里(..)或aptid在(..)' – 2010-03-04 18:58:59

+0

感谢您的澄清。测试,似乎工作: SELECT unitid','name' FROM apartmentunits WHERE aptid IN(SELECT'aptid' FROM rentconditionsmap WHERE rentcondid = 4 AND condnum = 1)AND aptid IN(SELECT'aptid' FROM rentconditionsmap WHERE rentcondid = 2 AND condnum = 1)ORDER BY名字ASC – 2010-03-04 19:18:41

0

使用JOIN(下面是TSQL sintax的加入,也可以使用显式INNER JOIN)。

SELECT apartmentunits.unitid, apartmentunits.name 
FROM apartmentunits, rentconditionsmap 
WHERE apartmentunits.aptid = rentconditionsmap.aptid 
AND rentconditionsmap.rentcondid = 1 
AND rentconditionsmap.condnum = 1 
-- AND whatever else... 
+1

ANSI-89连接语法 - 呸但我没有downvote你 – 2010-03-04 18:21:11

+0

反ANSI偏执;!。!) – DVK 2010-03-04 18:23:35

1

为什么不:

SELECT unitid, name
FROM apartmentunits a INNER JOIN rentconditionsmap r on a.aptid = r.aptid
WHERE (rentcondid = 1 and condnum = 1) OR (rentcondid = 2 and condnum = 2)

+0

SELECT a.unitid,a.name FROM apartmentunits一个INNER JOIN rentconditionsmap R ON a.aptid = r.aptid WHERE(r.rentcondid = 1 AND r.condnum = 1)AND(r.rentcondid = 2且r.condnum = 1) 测试,并且不返回任何结果,在那里我可以看到应该有一个与这套租金条件相匹配的aptid。 – 2010-03-04 18:26:10

1

使用ANSI-92连接语法:

SELECT au.unitid, 
     au.name 
    FROM APARTMENTUNITS au 
    JOIN RENTCONDITIONSMAP rcm ON rcm.aptid = au.aptid 
          AND rcm.rentcondid = 1 
          AND rcm.condnum = 1 
+0

ANSI-92语法更具可读性。 WHERE子句应该只有在JOIN之后应用的条件。 1 up – 2010-03-04 18:36:31