У меня есть две таблицы категории и отели, где category.id должна быть равна hotel.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?
Попробуйте следующее:
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)
)
)
Я надеюсь, что это сработает. Если это не так, надеюсь, это даст вам идеи о чем-то, что может сработать, или даже дать другим идеи о том, как решить эту проблему. По крайней мере, его можно было бы использовать, чтобы увидеть, что не работает.
Вы можете сделать это следующим образом.
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;
}
}
}
Привет, я не уверен в запросе, но у меня есть альтернативный способ. Сначала найдите весь массив категорий и найдите 3 записи из таблиц отелей.
шаг I:
$ sql = "SELECT * FROM Table category",
выполнить запрос и поместить результаты в массив категорий
Шаг II: Сделать цикл Для ($ я = 0; isset (массив категорий [$ i]); $i ++) { запрос на 3 записи из таблицы отелей Выполните это и сохраните все данные в массиве } Таким образом, вы также можете получить запись. Это не точное решение вашей проблемы, но вы можете использовать ее для решения вашей проблемы.
Итак, вы хотите найти три отеля для каждой категории... есть варианты!
Самый простой способ, который я могу представить, - выполнить запрос для каждой категории.
SELECT
h.*
FROM
hotels h
WHERE
h.catid = 1
LIMIT 0, 3
Вы должны иметь возможность использовать DISTINCT (категорию) и ограничивать запрос тремя результатами
SELECT DISTINCT(c.id), h.* FROM hotels h INNER JOIN category c ON h.catid = c.id ORDER BY h.catid, h.hid LIMIT 3