MySQL查询中的左连接还是右连接?
问题1:MySQL查询中的左连接还是右连接?,mysql,sql,join,left-join,Mysql,Sql,Join,Left Join,问题1: table1: node fields: nid, ,title,type,created 问题2: 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_typ
table1: node
fields: nid, ,title,type,created
问题2:
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
content\u id
value等于nid
value,但在表1中,nid
可能与表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\u id
与表1中的nid
有一对一的对应关系
现在,我想得到一个标题列表
。哪个编号是22
。降序是根据ContentSum
和创建的
。有办法得到这个吗?我应该使用左连接吗?我不知道如何把两个问题变成一个问题
重新表述它:
表1结构{node}:
table 1 table2
nid content_id
1 1
2 3
3
表二结构{投票}
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
我想:
获取22个标题列表
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
1,nid
的值等于表2中content\u id
的值
标题列表队列顺序为:
1,首先根据表2content\u id
递减平铺列表(递减content\u id使用“对于每个content\u id,值为1的行数减去值为0的行数”)
2,因为表2可能少于22条记录,当值为1的行数减去值为0的行数时,表2的值相同。当出现这种情况时。使用表1中创建的字段来降低磁贴
左连接
...
test one
test two
example one
example two
...
这意味着元组不必在表2中有匹配的元素,但表1中的所有元素都将包括在内
<table1> left join <table2>
右连接
这意味着元组不必在表1中有匹配的元素,但表2中的所有元素都将包括在内。左连接
<table1> left join <table2>
这意味着元组不必在表2中有匹配的元素,但表1中的所有元素都将包括在内
<table1> left join <table2>
右连接
这意味着元组不必在表1中有匹配的元素,但表2中的所有元素都将包括在内。对于您提供的示例,我不清楚其中的一些。我将结合您提供的两个查询给出一个查询
<table1> left join <table2>
试试这个
<table1> right join <table2>
注意:您可以删除一些不需要的列
其他需要知道的事情:
- 使用
LEFT JOIN
还将创建一行,该行没有与content\u id等价的nid
。这就是为什么我添加了v_api.ContentSum
,让您看到它将创建一个null
值
- 如果要在返回值为null时添加值,可以使用
COALESCE
。如果不希望包含具有v_api.ContentSum
等于null
的行,则可以使用internal JOIN
- 关于
右键连接
根据我的理解,我不确定这是否是您对问题所需要的
再看看这个
我希望这能有所帮助。对于您提供的示例,我不太清楚其中的一些。我将结合您提供的两个查询给出一个查询
试试这个
<table1> right join <table2>
注意:您可以删除一些不需要的列
其他需要知道的事情:
- 使用
LEFT JOIN
还将创建一行,该行没有与content\u id等价的nid
。这就是为什么我添加了v_api.ContentSum
,让您看到它将创建一个null
值
- 如果要在返回值为null时添加值,可以使用
COALESCE
。如果不希望包含具有v_api.ContentSum
等于null
的行,则可以使用internal JOIN
- 关于
右键连接
根据我的理解,我不确定这是否是您对问题所需要的
再看看这个
我希望这能有所帮助。如果你能重新表述这个问题,让它更容易阅读,更准确地了解需要什么,那就太好了。对不起,这个问题太难描述了。也就是说。我想要一份标题列表。哪个号码是22。降序是根据表2内容和表1创建的。我同意威尔的观点。提供两个表的DDL、示例数据和查询的预期输出。我已经更新了问题。期待它更清楚。如果你能重新措辞的问题,使它更容易阅读,并准确地看到需要什么,那将是伟大的。对不起,这个问题太难描述。即。我想要一份标题列表。哪个号码是22。降序是根据表2内容和表1创建的。我同意威尔的观点。提供两个表的DDL、示例数据和查询的预期输出。我已经更新了问题。期待的更清楚。谢谢。但我不知道如何编写查询。太复杂了。非常简洁地解释了左右连接的区别。谢谢。但我不知道如何编写查询。它太复杂了。非常简洁地解释了左连接和右连接的区别。很抱歉,它没有输出任何内容。当我删除左连接时。它可以输出一些东西。谢谢,好吗?检查列字段是否正确。在发布之前,我在我的工作台上做了一个测试,我得到了一个结果。你在哪里测试的?你是我的英雄!非常高兴。你帮我解决了一个难题。但是我不知道您的查询的真正含义是什么。这里比较棘手的部分是左连接
,它只是使用子查询创建一个虚拟表
。并像使用表格一样使用v_表格
。我只是使用虚拟表
,因为我不知道如何调用它:)这是因为它将返回左表
中的所有行,该表是节点
,即使它在投票的右表
上没有匹配项。最好阅读一些关于加入的文档,看看我提供的链接。很抱歉,它是