2010-03-04 81 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