@max_rip

SQL запрос, как?

Есть таблица

id|parentId|name|isMain

1|1|a1|null

2|1|a2|null

3|1|a3|null

4|2|b1|null

5|2|b2|1

6|2|b3|null

8|3|c1|1

9|3|c2|null

Надо отобрать записи так, чтоб с каждой группы parentId, была только одна строка с этим справляется GROP BY, но так чтоб если в группе был isMain 1, то отображалась она, если нет, то любой соответствующей группе.


В общем на выходе надо получить что-то из серии


1|1|a1|null

5|2|b2|1

8|3|c1|1
  • Вопрос задан
  • 2526 просмотров
Решения вопроса 1
m00t
@m00t
Вариант 1 — в лоб. Формально работает правильно (в оличие от первых двух ответов), но некрасиво:
SELECT * FROM test t1
WHERE
t1.is_main = (
SELECT MAX(is_main) FROM test t2 WHERE t2.parent_id = t1.parent_id
)
OR NOT EXISTS(SELECT * FROM test t2 WHERE t2.parent_id = t1.parent_id AND t2.is_main IS NOT NULL)
GROUP BY t1.parent_id
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
@edogs
select id, parentid, name, max(ismain) as max_ismain from tablename group by parentid;
Ответ написан
FreeTibet
@FreeTibet
dharma supplier
Написал ради интереса попытки сэмулировать T-SQL ROW_NUMBER на MySQL:


SELECT DISTINCT t.nid, f.* FROM (
  SELECT 
    id,
    parentId,
    isMain,
    @nid := CASE 
      WHEN @parentId <> parentId 
      THEN id
      ELSE @nid
    END AS nid,
    @parentId := parentId AS t2
  FROM hfeed 
  ORDER BY parentID, isMain DESC
) AS t
INNER JOIN hfeed AS f ON f.id = t.nid
Ответ написан
Комментировать
Evengard
@Evengard
Попробуйте ка
SELECT *, isMain IS NULL AS isnull FROM tablename ORDER BY isnull ASC GROUP BY parentId;
Ответ написан
@MikhailEdoshin
SELECT g.parentId, d.id, d.name, d.isMain
  FROM (SELECT DISTINCT parentId
          FROM my_table) g,
  JOIN my_table d
    ON d.id == (
       SELECT o.id
         FROM my_table o
        WHERE o.parentId == g.parentId
     ORDER BY o.isMain DESC)

Нужен индекс по parentId, но он у вас, наверное, есть. И вот это вот == (SELECT ...) — это, наверное, особенность SQLite, там такая конструкция возвращает единственное значение. В другом диалекте может потребоваться писать что-то вроде:

    ON d.id IN (
       SELECT o.id
         FROM my_table o
        WHERE o.parentId == g.parentId
     ORDER BY o.isMain DESC
        LIMIT 1)
Ответ написан
Комментировать
@Acristi
Вот такой вариант может подойдет?
Расставить индексы и возможно еще кое что оптимизировать…

Select id, ParentId, name, isMain
FROM dbo.Cash
where isMain is not null
UNION ALL
SELECT x.*
FROM dbo. x
inner join
(
Select ParentId, MIN(id) as id
FROM dbo.Cash
where parentId not in (Select ParentId FROM dbo.Cash where isMain is not null)
group by ParentId
) y
on x.id = y.id
order by 2
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы