2011-10-28 62 views
1

我有一个表广东话构建无子查询

CREATE TABLE logs(
    id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    ip INT(11) UNSIGNED NOT NULL, 
    `date` TIMESTAMP, 
    `time` INT(11) UNSIGNED NOT NULL, 
    referrer VARCHAR(255) NOT NULL, 
    uri VARCHAR(255) NOT NULL, 
    PRIMARY KEY (id), 
) 

MySQL的选择查询,我需要通过IP获取以下数据组则:

  • IP
  • 引荐,这是第一次对IP (日期为分)
  • 上次访问uri的IP
  • 独特uris的数量

是否可以在没有子查询的情况下编写这样的查询?

我与子查询的解决方案:

SELECT 
    `logs`.`ip`, 
    (SELECT 
     `tmp`.`referrer` 
    FROM 
     `logs` AS `tmp` 
    WHERE 
     `tmp`.`ip` = `logs`.`ip` 
    ORDER BY `tmp`.`date` 
    LIMIT 1) 'referrer', 
    (SELECT 
     `tmp`.`uri` 
    FROM 
     `logs` AS `tmp` 
    WHERE 
     `tmp`.`ip` = `logs`.`ip` 
    ORDER BY 
     `tmp`.`date` DESC 
    LIMIT 1) 'uri', 
    COUNT(DISTINCT (`logs`.`uri`)) 'urls' 
FROM 
    `logs` 
GROUP BY 
    `logs`.`ip` 

回答

0
select 
    `logs`.`ip`, 
    `tmp`.`referrer` 
    `tmp`.`uri` 
    count(distinct `logs`.`uri`)) as `urls` 
from `logs` 
left join `tmp` on `tmp`.`ip`=`logs`.`ip` 
group by `logs`.`ip` 

然而,这并不允许order by tmp.date一部分。如果绝对需要,请在评论中告诉我,我会更新此代码以允许这样做。