MySQL Выбрать From To и Исключить m в возвращенном результате id - PullRequest
0 голосов
/ 24 мая 2019

У меня есть SQL, который возвращает это из MySQL:

SELECT id, channel, (y.count) AS channels
FROM (
    SELECT s.id AS id, c.sort, s.channel
    FROM channels c, streams s
    LEFT JOIN logo l ON s.id=l.channel
    WHERE JSON_SEARCH(s.bouquet, 'one', 1) IS NOT NULL 
    AND JSON_SEARCH(c.bouquet, 'one', 1) IS NOT NULL
    AND JSON_SEARCH(c.sort, 'one', s.id) IS NOT NULL

    UNION 

    SELECT m.marker, c.sort, m.channel
    FROM markers m, channels c, streams s
    LEFT JOIN logo l ON s.id=l.channel
    WHERE JSON_SEARCH(m.bouquet, 'one', 1) IS NOT NULL 
    AND JSON_SEARCH(c.bouquet, 'one', 1) IS NOT NULL
    AND JSON_SEARCH(c.sort, 'one', m.marker) IS NOT NULL
    AND s.id=l.channel) ch
CROSS JOIN (
    SELECT count
    FROM (
        SELECT COUNT(s.id RLIKE '^[0-9]+$') AS count
        FROM streams s, channels c 
        WHERE JSON_SEARCH(s.bouquet, 'one', 1) IS NOT NULL 
        AND JSON_SEARCH(c.bouquet, 'one', 1) IS NOT NULL 
        AND JSON_SEARCH(c.sort, 'one', s.id) IS NOT NULL) AS x) AS y
ORDER BY LOCATE(CONCAT('"', id, '"'), sort);

Возврат из этого запроса:

+----+-------------------+
| id | channel           |
+----+-------------------+
| m2 | AA-AA             |
| 1  | KR_A 1            |
| 2  | KR_A 2            |
| 11 | HR_A 3            |
| 12 | HR_B 1            |
| m4 | BB-BB             |
| m3 | CC-CC             |
| 17 | SR_B 1            |
| m5 | DD-DD             |
| m1 | EE-EE             |
+----+-------------------+

Мне нужно изменить SQL, когда я добавляю m2 в запросевернуть:

1
2
11
12

И если я добавлю m3, мне нужно получить:

17

Поэтому я пытаюсь добавить это в начале SQL для фильтрации id:

SELECT IF (id BETWEEN 'm2' AND '%m', id, 0) As id, channel, (y.count) AS channels

и я получаю это:

+----+-------------------+----------+
| id | channel           | channels |
+----+-------------------+----------+
| m2 | AA-AA             |        5 |
| 0  | KR_A 1            |        5 |
| 0  | KR_A 2            |        5 |
| 0  | HR_A 3            |        5 |
| 0  | HR_B 1            |        5 |
| m4 | BB-BB             |        5 |
| m3 | CC-CC             |        5 |
| 0  | SR_B 1            |        5 |
| m5 | DD-DD             |        5 |
| m1 | EE-EE             |        5 |
+----+-------------------+----------+

И нужно получить это:

+----+-------------------+----------+
| id | channel           | channels |
+----+-------------------+----------+
| 1  | KR_A 1            |        4 |
| 2  | KR_A 2            |        4 |
| 11 | HR_A 3            |        4 |
| 12 | HR_B 1            |        4 |
+----+-------------------+----------+

Я не знаю, как сделать в запросе SQL, который выбирает из 'm2' до следующего 'm' и исключить 'm2' и 'm' из результатов .... любая помощь?

1 Ответ

1 голос
/ 24 мая 2019

Вы можете использовать переменную для сохранения, если предыдущая строка была желаемым маркером (когда id начинается с ' m ') или если id находится после желаемого маркера (когда идентификатор не начинается с ' m ' и флаг (@showRow) активен)

SET @showRow:=0;
SELECT id, channel, (y.count) AS channels...
...
 WHERE 
     (
       @showRow:=( (id like 'm%' and id = 'm2') or (id not like 'm%' and @showRow ) )
      )
   -- ommit marker row
   AND id not like 'm%'
;
...