键值表的“SELECT .. WHERE .. AND ..”(两个条件)?

时间:2016-05-17 10:05:45

标签: mysql key-value

我正在尝试做什么

我想通过询问commentIdtype = x 来获取target = x

通常

(这是一个例子),表的结构应如下所示:

+-----------+-------+--------+
| commentId | type  | target |
+-----------+-------+--------+
|         1 | post  |      2 |
|         2 | post  |      8 |
|         3 | video |      6 |
+-----------+-------+--------+

在这种情况下,我可以使用此查询来获取commentId

SELECT `commentId` FROM `comment_datas` WHERE type = 'post' AND target = '2'

真实问题

这是表的真实结构(使用键值设计):

+-----------+--------+-------+
| commentId |  name  | value |
+-----------+--------+-------+
|         1 | type   | post  |
|         1 | target | 2     |
|         2 | type   | post  |
|         2 | target | 8     |
|         3 | type   | post  |
|         3 | target | 6     |
+-----------+--------+-------+

现在我不知道如何通过我上面写的查询得到commentId,有什么想法吗?

5 个答案:

答案 0 :(得分:5)

commentId分组。然后,您可以使用您想要的条件过滤那些至少有一条记录的组

SELECT commentId 
FROM comment_datas 
GROUP BY commentId
HAVING sum(name = 'type' and value = 'post') > 0 
   AND sum(name = 'target' and value = '2') > 0

答案 1 :(得分:3)

直到@ juergen-d修正了他的错字:这是更正的版本:

sum

<强>解释

name = type接受除列名之外的聚合表达式,因此我们的想法是将条目与value = postsum相加 通过使group by大于0,select只返回满足聚合表达式的target行 - $(document).ready(function(){ $('#signup_form').submit(function(e){ e.preventDefault(); $.ajax({ url:'form_process.php', type:'POST', data: $('#signup_form').serialize(), success:function(result){ alert(result); } }); }); }); 也是如此。

答案 2 :(得分:1)

您需要使用类型或其他方式的子选择对值编号进行选择。

这样的东西
SELECT commentId FROM comment_datas
WHERE name="type" AND value="post"
AND commentId IN (
    SELECT commentId FROM comment_datas WHERE name="target" AND value=2
);

但严重的是,如果你离开这样的架构,你会更频繁地遇到这样的问题。你基本上有两行而不是一行。

而不是&#34; name&#34;和&#34;价值&#34;更好地使用实际名称和值作为列名称和值。所以删除&#34; name&#34;和&#34;值&#34;,并添加&#34;键入&#34;和&#34;目标&#34;作为列。这样您就没有双重条目,您可以使ID唯一。您当前的架构将键值系统置于键值系统之上。

答案 3 :(得分:0)

用户,您将获得两条记录

ofstream fout2("int_data", ios::binary);
const int a = 2;

fout2.write(reinterpret_cast<const char*>(&a), sizeof(a));
fout2.close();

int b = 0;
ifstream fin2("int_data", ios::binary);

if(!fin2.read(reinterpret_cast<char*>(&b), sizeof(b))) {
    cout << "fail() reading" << endl;
}
cout << b << endl;;

答案 4 :(得分:0)

试试这个,

    SELECT 
            `commentId` 
    FROM 
            `comment_datas` 
    WHERE 
            (`name` = 'type'   AND `value` = 'post') OR 
            (`name` = 'target' AND `value` = '2') 
    GROUP BY
            `commentId`