左连接还是右连接MySQL查询?

时间:2011-05-21 02:54:24

标签: mysql sql join left-join

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

query1:

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

QUERY2:

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。其中,是22descending order符合ContentSumcreated。有没有办法得到这个?我应该使用left join吗?我不知道如何让两个查询变成一个?

a hard query to write in mysql to me?

改写

表一结构{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使用“For each content_id,value = 1的行数减去值= 0的行数”)

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

2 个答案:

答案 0 :(得分:5)

<table1> left join <table2>

表示元组不必在table2中具有匹配元素,但将包含table1中的所有元素。

<table1> right join <table2>

表示元组不必在table1中具有匹配元素,但将包含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的行。这就是我为您添加v_api.ContentSum以查看它会创建null值的原因。
  • 如果要返回值COALESCE,则可以使用null。您可以使用INNER JOIN如果您不想包含v_api.ContentSum等于null的行。
  • 关于RIGHT JOIN根据我的理解,我不确定这是否是您所需要的问题。

另请查看此mysql/join

我希望这可以成为一种帮助。

相关问题