Mysql:获取每页唯一列的行

时间:2011-02-24 15:12:53

标签: php mysql sql

开始执行我的英语,但我需要一个sql的帮助:

我有表格,例如: ID,id_user,offer,timestamp

我需要获得一个带有排序的行,这将是页面上的一个id_user(例如,每10行中只有一个唯一的id_user,第二个带有时间戳的顺序)


示例:

1, Pepa, Auto, 1.1.2011
2, Pepa, Motorka, 1.1.2011
3, Karel, Traktor, 2.1.2011
4, Lukas, Jeep, 2.1.2011
5, Pepa, Autokara, 3.1.2011
6, Jindra, Traktor, 5.1.2011

=>订购(页面上有2行)

**1. Page**
1, Pepa, Auto, 1.1.2011
3, Karel, Traktor, 2.1.2011


**2. Page**
2, Pepa, Motorka, 1.1.2011
4, Lukas, Jeep, 2.1.2011


**3. Page**
5, Pepa, Autokara, 3.1.2011
6, Jindra, Traktor, 5.1.2011

简单的“一页上的独特用户优惠”

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

你试过“分组”吗?

delimiter //

connect pepa

drop table if exists offers;
create table offers (
id SERIAL,
id_user VARCHAR(20) NOT NULL,
offer VARCHAR(20) NOT NULL,
timestamp TIMESTAMP DEFAULT NOW()
);

insert into offers
(id_user,offer)
values
('Pepa', 'Auto'),
('Pepa', 'Motorka'),
('Karel', 'Traktor'),
('Lukas', 'Jeep'),
('Pepa', 'Autokara'),
('Jindra', 'Traktor');

select * from offers group by id_user order by timestamp;

//

这会产生:

id  id_user offer   timestamp
4   Lukas   Jeep    2011-06-05 21:14:10
6   Jindra  Traktor 2011-06-05 21:14:10
1   Pepa    Auto    2011-06-05 21:14:10
3   Karel   Traktor 2011-06-05 21:14:10

请注意,没有重复的id_users。如果包含条件语句(“where”),则可以根据登录人员的id_user创建唯一页面。

希望这会有所帮助。 :)

干杯!

(请注意,按时间戳排序可能会有点奇怪。不要忘记,您总是可以使用您选择的语言[PHP等]发布流程。)

答案 1 :(得分:0)

此PHP代码将生成您在问题中列出的相同输出。它可能不是世界上最有效的东西,但它完成了工作。

你可能会写一个时髦的MySQL查询来做这件事,但我不知道它会如何扩展成千上万的记录等等。而你正在制作页面。 :)

<?php

// Collect stuff from the database
$dbc=mysqli_connect('127.0.0.1','user','passwd','pepa') or 
 die('Could not connect!');
$getOffers='select * from offers';
$rs=mysqli_query($dbc,$getOffers);
while($thisRow=mysqli_fetch_assoc($rs))
 $offers[]=$thisRow;
mysqli_close($dbc);

// Create the pages
// (this is probably a bit over the top, but you get the idea)
foreach($offers as $oI => $thisOffer)
 $offers[$oI]['used']=false;  // <-- tell us if we've used the record or not
$thisUser='Pepa';  // <-- the user who should appear at the top of each page
$numRecsPerPage=2; // <-- the number of records per page
$cPg=-1; foreach($offers as $oI => $thisOffer) {
    if($thisOffer['id_user']==$thisUser) {
        $cPg++;
        $offers[$oI]['used']=true;
        $page[$cPg][]=$thisOffer;
        $recsUsed=1; foreach($offers as $pI => $procOffer) {
            if(!$offers[$pI]['used'] && $offers[$pI]['id_user']!=$thisUser) {
                $offers[$pI]['used']=true;
                $page[$cPg][]=$procOffer;
                $recsUsed++;
            }
            if ($recsUsed>=$numRecsPerPage) break;
        }
    }
}  

// Print the pages
foreach($page as $thisPage) { 
    foreach($thisPage as $thisRow)
     echo   $thisRow['id']."\t".$thisRow['id_user']."\t".
            $thisRow['offer']."\t".$thisRow['timestamp']."\n";
    echo "\n";
}

?>

输出:

1   Pepa    Auto    2011-06-05 21:14:10
3   Karel   Traktor 2011-06-05 21:14:10

2   Pepa    Motorka 2011-06-05 21:14:10
4   Lukas   Jeep    2011-06-05 21:14:10

5   Pepa    Autokara    2011-06-05 21:14:10
6   Jindra  Traktor 2011-06-05 21:14:10

很抱歉添加另一个答案 - 否则我会添加评论,但我认为代码在这里更有帮助。