【问题标题】:left join or right join in a MySQL query?MySQL 查询中的左连接还是右连接?
【发布时间】:2011-05-21 02:54:23
【问题描述】:
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。其中 unmber 是 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、首先根据表2content_id对tile列表进行降序(content_id降序使用“对于每个content_id,value=1的行数减去value=0的行数”)

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

【问题讨论】:

  • 如果您可以改写问题以使其更易于阅读并准确了解需要什么,那就太好了。
  • 对不起,这个问题很难描述。即。我想得到一个标题列表。其中unmber是22。降序是根据table2 ContentSum和table1创建的。
  • 我同意威尔的观点。提供两个表的 DDL、示例数据和查询的预期输出。
  • 我已经更新了这个问题。期待更清楚。

标签: mysql sql join left-join


【解决方案1】:
<table1> left join <table2>

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

<table1> right join <table2>

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

【讨论】:

  • 谢谢。但我不知道如何编写查询。太复杂了。
  • 对左右连接区别的简洁解释。
【解决方案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 值。
  • 如果你想添加一个返回null的值,你可以使用COALESCE。如果不想包含v_api.ContentSum 等于null 的行,可以使用INNER JOIN
  • 关于RIGHT JOIN,根据我的理解,对于您的问题,我不确定这是否是您所需要的。

也看看这个mysql/join

我希望这能有所帮助。

【讨论】:

  • 对不起,它什么也没输出。当我删除左连接时。它可以输出一些东西。谢谢
  • 确定吗?检查列字段是否正确。在发布之前,我在工作台上进行了测试并得到了结果。你在哪里测试的?
  • 你是我的英雄!很高兴。你帮我解决了一个难题。但我不知道您查询的真正含义是什么。
  • 这里棘手的部分是LEFT JOIN,它只是使用子查询创建virtual table。并像桌子一样使用v_table。我只使用virtual table,因为我不知道怎么称呼它:)
  • 这是因为它会返回left table(即node)中的所有行,即使它在right table(即votingapi_vote)上没有匹配项。最好阅读一些关于加入的文档,请参阅我提供的链接。
猜你喜欢
  • 2012-08-08
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 2013-02-25
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多