[英]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
根据ContentSum
并created
。 有没有办法得到这个? 我应该使用left join
吗? 我不知道如何使两个查询变成一个?
改写一下 :
表一结构{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.