我有一个像这样的表结构:
Page_id || type || user_id
1 1 0
2 2 0
3 3 0
4 1 1
5 2 1
6 3 1
从这张表中我想得到page_id 4,5和6。
但我也可以拥有像这样的表数据
Page_id || type || user_id
1 1 0
2 2 0
3 3 0
4 1 1
5 2 1
然后我想获取page_id 4,5和3。
所以我必须获得所有类型,但优先级为user_id,如果没有user_id 1的记录,则取0
尝试了很多。我知道我可以用PHP对它进行排序,但我希望MySQL有一种方法。
关心安德烈亚斯
////////答案///////// 我收到了很多建议,我没有全部尝试过,所以我不能告诉它们他们在哪里。但我接受了一个对我有用的答案。谢谢大家。
答案 0 :(得分:1)
您可以执行SELECT
查询,如下所示
SELECT Page_id
FROM table
WHERE user_id != 0
答案 1 :(得分:1)
此SQL Fiddle演示了以下查询:
SELECT DISTINCT
(
SELECT s1.Page_id
FROM myTable AS s1
WHERE m.type = s1.type
ORDER BY s1.Page_id
LIMIT 1
) AS PageID, type,
(
SELECT s2.user_id
FROM myTable AS s2
WHERE m.type = s2.type
ORDER BY s2.Page_id
LIMIT 1
) AS User
FROM myTable AS m
结果是Page_id
为1,2和4的记录。正如您在Page_id
订购的两个子查询中所看到的,以确保数据从同一记录和Page_id
的第一个type
被选中。
答案 2 :(得分:1)
SELECT a.Type, a.Page_ID
FROM table a
INNER JOIN
(SELECT Type, MAX(User_ID) AS User_ID
FROM table
GROUP BY Type ) b
ON a.Type = b.Type AND a.User_ID = b.User_ID
答案 3 :(得分:0)
要仅返回一对列的唯一记录,您将需要使用GROUP BY语句。然后,对于列之外的任何其他列,您需要选择一个聚合函数,以便它知道如果在该组中找到多个记录,则汇总该值。在这种情况下,你想要非零,所以max()可以工作
SELECT type, max(user_id) as user_id
FROM table
GROUP BY type
答案 4 :(得分:0)
select page_id,type from (
select page_id,type, user_id from mytable
group by page_id,type, user_id having user_id=max(user_id)
) as x where user_id=1
答案 5 :(得分:0)
对于user_id不为零的页面,是否会有多行?因为如果不是(如果每页只有一行,其中user_id = 1)那么这将有效:
SELECT ifNull(t1.page_id,t2.page_id) as page_id, t1.type,
CASE WHEN t2.page_id IS NULL THEN t1.user_id ELSE t2.user_id END as user_id
#start with all rows (including duplicates)
FROM myTable t1
#look for a user_id > 0 for this type
LEFT OUTER JOIN myTable t2 ON t1.type = t2.type AND t2.user_id > 0
WHERE t2.page_id IS NULL # if no record with user_id > 0 found, then no need to filter
# if a record with user_id > 0 was found, then filer out the user_id = 0 record
OR (t2.page_id IS NOT NULL AND t1.user_id > 0)
参见SQLFiddle:http://sqlfiddle.com/#!2/ba877/5