我有两个表类别和酒店,其中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完成吗?
答案 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条记录 执行此操作并将所有数据存储在数组中 } 通过这种方式,您也可以获得记录。这不是您问题的确切解决方案,但您可以使用它来解决您的问题