Выберите n элементов, начинающихся с каждого алфавита от az до MySQL - PullRequest
0 голосов
/ 10 апреля 2020

Я пытался задать этот вопрос ранее, но модераторы закрыли вопрос, сославшись на то, что он неясен. Надеюсь, на этот раз я проясню.

У меня есть таблица услуг с до 1000 услуг. В таблице есть столбец id & service_title. Итак, я в основном хочу получить 10 услуг для каждого алфавита, начиная с A до Z. Если есть менее 10 элементов, начинающихся с любого конкретного алфавита, то я хочу получить их все. Также я хочу, чтобы они были в алфавитном порядке, если это возможно.

Вот моя таблица услуг.

enter image description here

Так что моя выходная таблица должна выглядеть примерно так тот, который показан ниже. Для простоты я показал 2 сервиса, начиная с каждого алфавита от A до J.

<table border="1">
	<caption>Services</caption>
	<thead>
		<tr>
			<th>id</th>
			<th>name</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>1</td>
			<td>Auditing</td>
		</tr>
		<tr>
			<td>2</td>
			<td>Accounting</td>
		</tr>
		<tr>
			<td>3</td>
			<td>Brick laying</td>
		</tr>
		<tr>
			<td>4</td>
			<td>Builders</td>
		</tr>
		<tr>
			<td>5</td>
			<td>Carpet Cleaning</td>
		</tr>
		<tr>
			<td>6</td>
			<td>Carpenters</td>
		</tr>
		<tr>
			<td>7</td>
			<td>Demolition</td>
		</tr>
		<tr>
			<td>8</td>
			<td>Dog Walking</td>
		</tr>
		<tr>
			<td>9</td>
			<td>Electrician</td>
		</tr>
		<tr>
			<td>10</td>
			<td>Equipment Hire</td>
		</tr>
		<tr>
			<td>11</td>
			<td>Fencing & Gates</td>
		</tr>
		<tr>
			<td>12</td>
			<td>Fright Services</td>
		</tr>
		<tr>
			<td>13</td>
			<td>Gardeners</td>
		</tr>
		<tr>
			<td>14</td>
			<td>Gate keepers</td>
		</tr>
		<tr>
			<td>15</td>
			<td>Handyman</td>
		</tr>
		<tr>
			<td>16</td>
			<td>Health service</td>
		</tr>
		<tr>
			<td>17</td>
			<td>Interview Trainer</td>
		</tr>
		<tr>
			<td>18</td>
			<td>Iterpersonal Relationship Coach</td>
		</tr>
		<tr>
			<td>19</td>
			<td>Joinery Experts</td>
		</tr>
		<tr>
			<td>20</td>
			<td>Jacket Maker</td>
		</tr>
	</tbody>
</table>

Вот код, который я придумал до сих пор

SELECT *
    FROM (
    SELECT id, service_title,
    @count := IF(@value = service_title, @count + 1, 1) AS count
    FROM services, (SELECT @count := 1, @value := NULL) a
    WHERE services.service_title REGEXP  '^[A-z]+$'
    ) a
WHERE a.count <= 10
Order by service_title

В моей таблице выходных данных я перечислил некоторые службы, которых нет в списке в образцах элементов на изображении таблицы, пожалуйста, не поднимайте это как проблему, так как я не могу отобразить все элементы на образце таблицы.

1 Ответ

1 голос
/ 10 апреля 2020

Вы можете попробовать запрос ниже с незначительными обновлениями по вашему запросу -

SELECT *
FROM (SELECT id,
             @count := IF(LEFT(@value, 1) = LEFT(service_title, 1), @count + 1, 1) AS cnt,
             @value := service_title service_title
    FROM services, (SELECT @count := 0, @value := 0) vars
    WHERE services.service_title REGEXP  '^[A-z]+'
    ORDER BY service_title, id
    ) a
WHERE a.cnt <= 10
Order by service_title, id

Демо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...