需要编写有效的查询

时间:2012-05-12 14:48:18

标签: mysql sql

您好我在撰写查询时需要帮助。

以下是我的数据库结构

id  name    key    value
1   book1   key1    abc
2   book2   key2    aaa
3   book3   key5    abc
4   book4   key3    abc
5   book5   key2    aaa
6   book6   key2    aab
7   book7   key1    abc
8   book8   key2    abc
9   book9   key1    abc
10  book10  key1    abc

我需要那些键组合key1与值abc和key2值为aaa的书。

所以它应该返回

1   book1   key1    abc
2   book2   key2    aaa
5   book5   key2    aaa
7   book7   key1    abc
9   book9   key1    abc
10  book10  key1    abc

预订有key2和值aab不会返回。

P.s这只是我为证明我的需要而做的一个示例结构。实际上我正在使用wordpress post meta table。

5 个答案:

答案 0 :(得分:2)

select id, name, key, value from <yourTable> 
where key = "key1" 
or (key = "key2" and value = "aaa");

您可能还想查看documentation

答案 1 :(得分:2)

select 
    id, name, key, value from <table> 
where 
    (key = "key1" and value="abc")
or 
    (key = "key2" and value = "aaa");

答案 2 :(得分:1)

SELECT * FROM mytable
WHERE key='key1' AND value='abc'
UNION ALL
SELECT * FROM mytable
WHERE key='key2' AND value='aaa'

答案 3 :(得分:1)

我认为根据您的设计在某个时间点,每本书会有几个key + value对。这意味着您可能希望选择多个特定键具有某些特定值的书籍。

这可以通过以下SQL实现(对于给定的示例):

SELECT t.id,t.name,k.key1,k.key2
  FROM test t
  JOIN (SELECT t.id,k1.value AS key1,k2.value AS key2
          FROM test t
          LEFT JOIN test k1 ON t.id=k1.id AND k1.`key`='key1'
          LEFT JOIN test k2 ON t.id=k2.id AND k2.`key`='key2'
  ) k ON t.id = k.id
WHERE k.key1='abc' OR k.key2 = 'aaa';

内部部分将创建一个带有主题键的旋转表,而外部部分将执行结果过滤。您可以使用此设置here

但是,对于这样的设计,我建议将主题中的表格拆分为两个单独的表格:booksparams。您可以观察此类设置here。 请注意,如果您将过滤条件更改为k.key1='abc' AND k.key2 = 'aaa',那么您只会book10匹配。

这个例子很简单,但它提出了这个想法。

答案 4 :(得分:0)

这是为了检查值是否具有key1和abc OR key2和aaa,因此它可以返回key1和key2

SELECT * FROM table WHERE key = 'key1' AND value ='abc' OR key = 'key2' AND value = 'aaa'