Как выбрать три строки из каждой категории в таблице?

0

У меня есть две таблицы категории и отели, где 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?

  • 0
    Какие 3 строки вы хотите? Топ 3? Случайный 3? Конкретный 3? Последние 3?
  • 0
    @AndyC: топ или последние 3, я хочу показать на главной странице 3 строки из каждой категории.
Теги:

5 ответов

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)
                )
)

Я надеюсь, что это сработает. Если это не так, надеюсь, это даст вам идеи о чем-то, что может сработать, или даже дать другим идеи о том, как решить эту проблему. По крайней мере, его можно было бы использовать, чтобы увидеть, что не работает.

  • 0
    Неизвестный столбец 'c.id' в 'предложении where'
  • 0
    @ Me-and-Coding: попробуйте обновленный
Показать ещё 3 комментария
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;
        }
    }
}
  • 0
    Эта версия MySQL еще не поддерживает «LIMIT & IN / ALL / ANY / SOME subquery»
  • 0
    Обновил мой ответ с помощью решения php.
Показать ещё 1 комментарий
0

Привет, я не уверен в запросе, но у меня есть альтернативный способ. Сначала найдите весь массив категорий и найдите 3 записи из таблиц отелей.

шаг I: $ sql = "SELECT * FROM Table category",
выполнить запрос и поместить результаты в массив категорий

Шаг II: Сделать цикл Для ($ я = 0; isset (массив категорий [$ i]); $i ++) {   запрос на 3 записи из таблицы отелей Выполните это и сохраните все данные в массиве } Таким образом, вы также можете получить запись. Это не точное решение вашей проблемы, но вы можете использовать ее для решения вашей проблемы.

0

Итак, вы хотите найти три отеля для каждой категории... есть варианты!

Самый простой способ, который я могу представить, - выполнить запрос для каждой категории.

SELECT
    h.* 
FROM
    hotels h
WHERE
    h.catid = 1
LIMIT 0, 3        
  • 0
    Вы сказали, что h.catid = 1, но catid не известен, это не может быть 1, это может быть и другое число.
0

Вы должны иметь возможность использовать DISTINCT (категорию) и ограничивать запрос тремя результатами

  • 0
    я пробовал это, но он показывал записи только для одной кошки: 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню