如何从表中的每个不同类别中选择三行?

时间:2010-06-01 10:27:36

标签: php sql mysql

我有两个表类别和酒店,其中category.id应该等于hotels.catid。现在,如何从酒店表中的每个不同类别中选择3行。

我有这个问题:

select h.* from hotels h inner join category c on h.catid = c.id
order by h.catid, h.hid

这会选择所有记录,但是我想为每个不同的类别选择三行,所以它应该返回9行,每行有3行。

如果在MySQL中无法做到这一点,可以用PHP完成吗?

5 个答案:

答案 0 :(得分:4)

试试这个:

select h.* 
from category c
  inner join (select * from hotels h where c.id = h.catid limit 3) h
order by h.catid, h.hid

我想知道这是否是MySQL中的有效语法...

如果没有,你可以尝试:

select h.*
from category c
  inner join hotels h on (c.id = h.catid)
where h.hid in (select h2.hid from hotels h2 where h2.catid = c.id limit 3)

第三次尝试:

select h.*
from category c
  inner join hotels h on (c.id = h.catid)
where exists (select * from (select h2.hid from hotels h2 where h2.catid = c.id limit 3) h3 where h3.hid = h.hid)

好的,这是另一种简单丑陋的尝试:

select * from hotels h
where h.hid <=
(select min(h1.hid) 
 from hotels h1 
 where h1.catid = h.catid 
   and h1.hid > (select min(h2.hid) 
                 from hotels h2 
                 where h2.catid = h1.catid 
                   and h2.hid > (select min(h3.hid) 
                                 from hotels h3
                                 where h3.catid = h2.catid)
                )
)

我希望它有效。如果不是这样,希望它会给你一些可能有效的想法,或者甚至可以让别人知道如何解决这个问题。至少它可以用来看看哪些不起作用。

答案 1 :(得分:2)

你可以通过以下方式完成。

select 
    h.* 
from 
    hotels h 
where 
    h.catid IN (
        select 
            c.catid 
        from 
            category c 
        order by
            RAND() 
        limit 1
    ) 
order by 
    h.catid, h.hid 
limit 3

这可以为您提供一个随机类别的3家酒店。

使用php你可以这样做

$i = 0;
$sql = "select catid from category order by rand()";
$query = mysql_query($sql);
while($row = mysql_fetch_object($query))
{
    if($i < 3)
    {
        $i++;
        $categories[] = $row->catid;
    }
    else
    {
        break;
    }
}

foreach($categories as $catid)
{
    $i = 0;
    $sql = "select * from hotels where catid = $catid";
    $query = mysql_query($sql);
    while($row = mysql_fetch_object($query))
    {
        if($i < 3)
        {
            $i++;
            $hotels[] = $row;
        }
        else
        {
            break;
        }
    }
}

答案 2 :(得分:0)

您应该能够使用DISTINCT(类别)并将查询限制为3个结果

答案 3 :(得分:0)

所以你想找到每个类别的三家酒店......还有选择!

我能想到的最简单的方法是按类别执行查询。

SELECT
    h.* 
FROM
    hotels h
WHERE
    h.catid = 1
LIMIT 0, 3        

答案 4 :(得分:0)

嗨我不确定查询,但我有另一种方法。首先找到所有类别数组,然后从酒店表中查找3条记录。

第一步: $ sql =“SELECT * FROM Table category”;
执行查询并将结果放在类别数组

第二步: 循环 For($ i = 0; isset(category array [$ i]); $ i ++) {     查询酒店表格中的3条记录 执行此操作并将所有数据存储在数组中 } 通过这种方式,您也可以获得记录。这不是您问题的确切解决方案,但您可以使用它来解决您的问题