mysql如何进行这样的查询

时间:2014-01-29 10:36:52

标签: mysql

这里有一些innodb表,是​​商店产品id,bm商店描述的关键词。

CREATE TABLE IF NOT EXISTS `myt` (
  `am` varchar(15) NOT NULL,
  `bm` varchar(30) NOT NULL,
  KEY `am` (`am`),
  KEY `bm` (`bm`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `myt` (`am`, `bm`) VALUES
('1', 'hello'),
('1', 'world'),
('2', 'this'),
('2', 'world'),
('3', 'hello'),
('2', 'there');

如何获得有“hello world”字样的产品?

我试过的查询:

(select * from myt a where bm='hello') union (select * from myt b where bm='world') where a.am=b.am

给了我一个错误:

 #1064 - You have an error in your SQL syntax;

如果我存储这样的数据,应该索引吗?感谢。

P.S。

如果没有主键的innodb表是否重要?

3 个答案:

答案 0 :(得分:1)

首先,您不应使用varchar来存储ID。

select am
from myt
where bm in ('hello', 'world')
group by am
having count(am) = 2

计数应该等于where子句中的描述数(在本例中为2)

考虑使用PostgreSQL而不是MySQL进行此类查询。使用PostgreSQL,您可以将数组存储在字段bm中,例如;

INSERT INTO `myt` (`am`, `bm`) VALUES
('1', ['hello','world']),
('2', ['this', 'world', 'there']),
('3', 'hello');

它还具有强大的功能,可以在之后搜索这些数组字段。

答案 1 :(得分:0)

您可以使用mysql中的OR来返回两件事的匹配项:

从myt a中选择* bm ='hello'或bm ='world'

答案 2 :(得分:0)

试试这个......

select * 
from 
    (
        select * 
        from myt 
        where bm='hello' 
        group by am
    ) t
join 
    (
        select * 
        from myt 
        where bm='world' 
        group by am
    ) t1 
    on t.am=t1.am