MySQL,检查结果是否有值,如果不是另一个

时间:2014-02-18 18:47:07

标签: php mysql sql subquery

我有一个像这样的表结构:

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有一种方法。

关心安德烈亚斯

////////答案///////// 我收到了很多建议,我没有全部尝试过,所以我不能告诉它们他们在哪里。但我接受了一个对我有用的答案。谢谢大家。

6 个答案:

答案 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