如何从具有多个匹配值的JOIN表中进行选择?

时间:2018-04-26 01:20:26

标签: mysql sql join

我有以下简单查询,当有一个要匹配的关键字时,它可以正常工作:

SELECT gc.id, gc.name 
FROM gift_card AS gc
JOIN keyword ON gc.id = keyword.gc_id 
WHERE keyword = 'mini'
GROUP BY gc.id 
ORDER BY id DESC

我想要做的是找到id 匹配我提供的至少两个关键字。我想只需添加一个简单的AND即可,但我得到空白结果。

SELECT gc.id, gc.name 
FROM gift_card AS gc
JOIN keyword ON gc.id = keyword.gc_id 
WHERE keyword = 'mini'
AND keyword = '2012'
GROUP BY gc.id 
ORDER BY id DESC

显然SQL不是我的强项,所以我正在寻找一些帮助我在这里做错了。

以下是我的表结构:

CREATE TABLE `gift_card` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=52 DEFAULT CHARSET=utf8;

CREATE TABLE `keyword` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `gc_id` int(11) NOT NULL,
  `keyword` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`),
  UNIQUE KEY `dupes_UNIQUE` (`gc_id`,`keyword`)
) ENGINE=InnoDB AUTO_INCREMENT=477 DEFAULT CHARSET=utf8;

1 个答案:

答案 0 :(得分:1)

不,and不起作用。一列不能在一行中包含两个不同的值。

相反,or。 。 。还有一点逻辑:

SELECT gc.id, gc.name 
FROM gift_card gc JOIN
     keyword k
     ON gc.id = k.gc_id 
WHERE k.keyword IN ('mini', '2012')
GROUP BY gc.id 
HAVING COUNT(*) = 2  -- both match
ORDER BY id DESC;

在具有多个表引用的查询中限定所有列名称是个好主意。