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
。其中,是22
。 descending order
符合ContentSum
和created
。有没有办法得到这个?我应该使用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
答案 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。
我希望这可以成为一种帮助。