2012-10-12 57 views
3

我有兩個表:goodscats_goods(關係表)。在JOIN中選擇第二個表上有兩個條件的行

商品:idname

Cats_goods:good_idcat_id

如何僅選擇goods其中有cat_id = 4 AND cat_id = 24?

曾嘗試:

SELECT DISTINCT * 
FROM `goods` AS `g` 
JOIN `cats_goods` AS `cg` ON (`g`.`id` = `cg`.`good_id`) 
WHERE (`cg`.`cat_id` = 24 AND `cg`.`cat_id` = 4) 

查詢給出了0的結果!

UPD: 對於每個good有1行中cats_goodscat_id = 4,在與cats_goods = cat_id 24.我只需要選擇那些goods具有BOTH條件匹配的一行。

UPD2:

goods表結構:

CREATE TABLE IF NOT EXISTS `goods` (
    `id` int(11) NOT NULL auto_increment, 
    `code` varchar(50) NOT NULL default '', 
    `title` varchar(255) NOT NULL default '', 
    `price` decimal(10,2) NOT NULL default '0.00', 
    `file` varchar(50) NOT NULL default '', 
    `preview` varchar(50) NOT NULL default '', 
    `order` int(11) NOT NULL default '0', 
    `selltype_id` int(11) NOT NULL default '0', 
    `xml_date` varchar(50) NOT NULL default '', 
    `invalid` tinyint(1) NOT NULL default '0', 
    PRIMARY KEY (`id`), 
    KEY `order` (`order`), 
    KEY `selltype_id` (`selltype_id`), 
    KEY `code` (`code`), 
    KEY `invalid` (`invalid`), 
    KEY `xml_date` (`xml_date`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5014 ; 

goods表數據:

(4964, '00000001731', 'gold 585', 10000.00, '', '', 0, 2, '', 0), 
(4965, '00000001733', 'gold 585', 10000.00, '', '', 0, 2, '', 0), 
(4966, '00000001769', 'gold 585', 8000.00, '', '', 0, 2, '', 0), 
(4967, '00000001767', 'gold 585', 8000.00, '', '', 0, 2, '', 0), 

cats_goods表結構:

CREATE TABLE IF NOT EXISTS `cats_goods` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `good_id` int(10) unsigned NOT NULL default '0', 
    `cat_id` int(10) unsigned NOT NULL default '0', 
    PRIMARY KEY (`id`), 
    KEY `good_id` (`good_id`,`cat_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=37530 ; 

cats_goods表數據:

(37474, 4964, 24), 
(37478, 4966, 24), 
(37477, 4966, 4), 
(37476, 4965, 24), 
(37475, 4965, 4), 
(37475, 4967, 4), 

ONLY goods 4965和4966必須被選擇。

+2

你能發佈一些數據嗎? –

+0

好吧,您的樣本數據並不是那麼有趣,因爲所有案例都符合您的要求... –

回答

2

嘗試

SELECT DISTINCT * 
FROM `goods` AS `g` 
JOIN `cats_goods` AS `cg1` ON (`g`.`id` = `cg1`.`good_id`) 
JOIN `cats_goods` AS `cg2` ON (`g`.`id` = `cg2`.`good_id`) 
WHERE (`cg1`.`cat_id` = 24 AND `cg2`.`cat_id` = 4) 
+0

似乎是它的工作示例! ;) –

+1

@webbandit我把一個sqlFiddle放在我的答案中,用Nalaka526的解決方案和我的答案。它沒有給出相同的結果,不確定你真正想要的結果...... –

+0

@RaphaëlAlthausNalaka526的解決方案對我的任務很有效。剛剛在我的項目上實施了他的例子。正如我所說的 - 我只需要選擇兩種條件匹配的商品記錄。 Nalaka526的例子就是這樣做的,只給我這些記錄,而不是加倍。無論如何感謝您花時間! –

0

此查詢相當有趣。一個字段如何可以同時有兩個值

SELECT DISTINCT * 
FROM `goods` AS `g` 
JOIN `cats_goods` AS `cg` ON (`g`.`id` = `cg`.`good_id`) 
WHERE (`cg`.`cat_id` = 24 AND `cg`.`cat_id` = 4) 

其更改爲ORWHERE條件,哥們。

SELECT DISTINCT * 
FROM `goods` AS `g` 
JOIN `cats_goods` AS `cg` ON (`g`.`id` = `cg`.`good_id`) 
WHERE (`cg`.`cat_id` = 24 OR `cg`.`cat_id` = 4) 

如果我問的是可能的,可以告訴你的錶轉儲?

+1

不是downvoter,而是與其他答案相同的原因。問題是有道理的,你只是給出了一個不好的答案,沒有理由不禮貌。 –

+0

我認爲這個問題很清楚(選擇同類別2中的商品) –

+1

我明白這一點。但價值可以真正擁有它,但只有通過關係。我的意思是,對於每個'好',cats_goods'中有一行'cat_id' = 4,'cats_goods'中有一行'cat_id' = 24 –

2

試試這個:

SELECT DISTINCT * 
FROM `goods` AS `g` 
JOIN `cats_goods` AS `cg` ON (`g`.`id` = `cg`.`good_id`) 
          and (`cg`.`cat_id` = 24 OR `cg`.`cat_id` = 4) 

SELECT DISTINCT * 
FROM `goods` AS `g` 
JOIN `cats_goods` AS `cg` ON (`g`.`id` = `cg`.`good_id`) 
where `g`.`id` in (24,4) 

SELECT DISTINCT * 
    FROM `goods` AS `g` 
    JOIN `cats_goods` AS `cg1` ON (`g`.`id` = `cg1`.`good_id`) 
           and (`cg1`.`cat_id` = 24) 
    JOIN `cats_goods` AS `cg2` ON (`g`.`id` = `cg2`.`good_id`) 
           and (`cg2`.`cat_id` = 4) 
+0

'OR'不能讓我的工作成功。 'OR'選擇具有'cat_id' = 24或'cat_id' = 4的兌換。我只需要選擇具有兩種條件匹配的記錄。 –

+0

我增加了一個解決方案。 – Parado

+0

Eah它也可以。我不得不再次加入'cats_goods'表。 –

0
SELECT a.good_id, a.cat_id from cats_goods a inner join goods b on a.good_id=b.id where a.cat_id in (4,24); 
相關問題