繁体   English   中英

在MySQL查询中是左联接还是右联接?

[英]left join or right join in a MySQL query?

table1: node
fields: nid, ,title,type,created

查询1:

mysql_query(SELECT nid,title, type,created FROM `node` where type="provider"  ORDER BY created DESC LIMIT 0 , 22)



table2:  votingapi_vote
fields:   content_id, value=1 or  value=0, value_type=option

查询2:

SELECT content_id,
       SUM(CASE WHEN value=1 THEN 1 
                WHEN value=0 THEN -1 
                ELSE 0 
           END) AS ContentSum
    FROM votingapi_vote
    WHERE value_type = 'option'
    GROUP BY content_id
    ORDER BY ContentSum DESC

content_id值等于nid值,但是在表1中, nid可能与表2没有一对一的对应关系。例如:

table 1     table2
nid          content_id

1              1
2              3
3

但是content_id与表1中的nid具有一对一的对应关系。

现在,我想获得一个title list 哪个22岁。 descending order根据ContentSumcreated 有没有办法得到这个? 我应该使用left join吗? 我不知道如何使两个查询变成一个?

一个很难的查询写在MySQL给我?

改写一下

表一结构{node}:

nid        type             title                 created

10          provider        test one              1298107010
11          provider        test two              1298107555    
12          provider        example one            1300524695 
13          provider        example two            1298081391
14          provider        example three          1298082340
15          company         example four           1298083519
16....      company         example five          1298083559

表二的结构{votingapi_vote}:

content_id      value    value_type

10                1          option
10                 0          option
11                 1          option
12                 0          option
15                 3          percent
15                 2          percent
16.....            0          option

我想要:

获得22个标题列表

...
test one
test two
example one
example two 
...

在图1中, nid的值等于表2中content_id的值。

标题列表队列顺序为

1,首先根据表2 content_id降序到图块列表(使用“对于每个content_id,value = 1的行数减去value = 0的行数”来降低content_id)

2,因为table2可能少于22条记录,并且当value = 1的行数减去value = 0的行数时具有相同的值。 当出现这种情况时。 使用表1中created字段使tile下降

<table1> left join <table2>

意味着元组不必在table2中具有匹配元素,但是将包括table1中的所有元素。

<table1> right join <table2>

意味着元组在表1中不必具有匹配元素,但表2中的所有元素都将包括在内。

对于示例,您提供的一些内容对我来说还不清楚。 我将给出一个结合了您提供的两个查询的查询。

尝试这个

SELECT nid,title, type,created, v_api.ContentSum
  FROM `node` n
  LEFT JOIN ( SELECT content_id,
                     SUM(CASE WHEN value=1 THEN 1 
                         WHEN value=0 THEN -1 
                         ELSE 0 
                     END) AS ContentSum
                FROM votingapi_vote
               WHERE value_type = 'option'
               GROUP BY content_id) v_api 
    ON n.nid = v_api.content_id
 where type="provider"
ORDER BY v_api.ContentSum DESC, created DESC LIMIT 0 , 22;

注意:您可以删除一些不需要的列。

其他须知:

  • 使用LEFT JOIN还将创建没有nid to content_id等效的nid to content_id的行。 这就是我添加v_api.ContentSum的原因, v_api.ContentSum让您看到它将创建一个null值。
  • 如果要添加返回null的值,则可以使用COALESCE 如果不想包含v_api.ContentSum等于null的行,则可以使用INNER JOIN
  • 关于RIGHT JOIN基于我的理解,我不确定这是否是您所需要的问题。

还要看看这个mysql / join

希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM