Mysql sorgusu yardım gerekli

5 Cevap php

i iki tablo kategori ve category.id hotels.catid eşit olmalıdır oteller var. Şimdi nasıl ben oteller tablodan kategorisinde her biri farklı 3 satır seçerim.

Ben bu sorgu var:

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

Bu tüm kayıtları seçer, ama hepsi her kategori için 3 satır ile 9 satırları dönmelidir çok farklı kategoride başına üç satır seçmek istiyorum.

Bu mysql yapılamaz, ayrıca php kodu lütfen hatırlatıyoruz.

Teşekkürler

5 Cevap

bu deneyin:

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

Bu MySQL geçerli sözdizimi olup olmadığını merak ediyorum ...

Değilse, sen deneyebilirsiniz:

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)

3. girişimi:

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)

Tamam burada sadece düz çirkin olan başka bir girişimde bulunuyor:

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

Umarım işe yarar. Olsa, umarım size çalışmak, ya da belki de başkalarının bu sorunu çözmek için nasıl fikirler verebilir şey fikir verecektir vermezse. En azından işe yaramazsa ne görmek için kullanılabilir.

Siz şu şekilde yapabiliriz.

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

Bu size bir rasgele kategoride 3 otelin vermelidir.

Php ile bunu şöyle yapabiliriz

$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;
        }
    }
}

Sen 3 sonuçlarına DISTINCT (kategori) ve limit sorgu kullanmak gerekir

Yani kategori başına üç otel bulmak istiyorum ... seçenek vardır!

Aklıma kolay yöntem kategori başına sorgu gerçekleştirmek için.

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

merhaba ben sorgu hakkında emin değilim ama bir alternatif tüm kategori dizi bulmak ve oteller tablolardan 3 kayıt bulmak way.first var.

step I: $sql="SELECT * FROM Table category ";
execute the query and place results in category array

Step II: Make a loop For($i=0;isset(category array [$i]);$i++) { query for 3 record from hotel tabel Execute this and store all data in array } In this way you can also get the record.This is not the exact solution of your problem but you can use this for resolving your problem