2015-10-31 4 views
0

У меня есть n записей в my_table.MySQL: получение записей на основе значения столбца

Я хочу, чтобы выбрать все записи из таблицы, поэтому я использую этот запрос:

SELECT * FROM `my_table`; 

Я тогда ограничить его с WHERE пункта:

SELECT * FROM `my_table` WHERE id > 30; 

Но есть колонка (cat_name) в my_table, значение которого является решающим. Значение этого столбца не является уникальным, и, следовательно, в записях может быть много повторений. Я хочу, чтобы ограничить записи таким образом, чтобы каждое значение величины cat_name «s НЕ ДОЛЖЕН быть повторен более чем в четыре раза, следовательно, я хочу такой результат:

+++++++++++++++++++++++++++ 
id | name  | cat_name 
+++++++++++++++++++++++++++ 
33 + Robert  + Radio 
34 + Alice  + Radio 
35 + Jennifer + Radio 
36 + Sara  + Radio 
37 + Maria  + TV 
38 + Sebastian + TV 
38 + Jack  + TV 
40 + Albert  + TV 
. 
. 
... the rest of records 

но СОЖАЛЕНИЮ Я получаю этот результат, потому что Я не как я должен ограничить запрос таким специфическим образом:

+++++++++++++++++++++++++++ 
id | name  | cat_name 
+++++++++++++++++++++++++++ 
33 + Robert  + Radio 
34 + Alice  + TV 
35 + Jennifer + Radio 
36 + Sara  + Radio 
36 + Maria  + Radio 
36 + Sebastian + TV 
36 + Jack  + Radio 
36 + Albert  + Radio 
... 
+0

Если ' 'Алиса ''связан с'' Radio'' в вашей таблице, то как вы можете получить результат, где '' Алиса' связана с '' TV''? –

+0

Ну, это пример данных, вы уходите далеко от вопроса, я говорю, что сосредоточиться на повторении 'cat_name', я не хочу, чтобы значение записи« cat_name »повторялось более четырех раз –

+0

Для относительно небольшого набора данных функция «COUNT()» и «HAVING» может выполнять эту работу. – pinepain

ответ

0

SELECT * FROM my_table WHERE ID> 30 ORDER BY DESC cat_name

https://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html

редактировать: жаль, читать слишком быстро. , если вы хотите ограничить количество строк в каждой группе «cat_name» - я не думаю, что есть простой способ с mySQL.

с postgreSQL вы можете выбрать row_number() OVER (PARTITION BY "cat_name") и фильтровать это, но я не знаю, есть ли эквивалент в mySQL.

Поэтому я рекомендовал бы позволить PHP фильтровать данные:

<?php 
[...] 
$resultarray = []; 
$lastgroup = ""; 
$count = 0; 
while($row = $mysqli_fetch_assoc()) { 
    if($row['cat_name'] != $lastgroup) { 
    $lastgroup = $row['cat_name']; 
    $count = 0; 
    } 
    $count++; 
    if($count <= 4) { 
    $resultarray[] = $row; 
    } 
} 
+0

это ответ на мой вопрос –

1

Я хотел бы решить эту проблему, перечисляя строки для каждого cat_name, а затем выбрать первые четыре:

select ci.* 
from (select t.*, 
      (@rn := if(@c = cat_name, @rn + 1, 
         if(@c := cat_name, 1, 1) 
         ) 
      ) as rn 
     from my_table t cross join 
      (select @c := '', @rn := 0) params 
     order by cat_name, id 
    ) ci 
where rn <= 4; 
Смежные вопросы