Ответы пользователя по тегу SQL
  • Существует ли нечто вроде "SQL Firewall"?

    @kfuntov
    Ещё есть вариант все нужные запросы посохранять в хранимые процедуры, и разрешить только их использование.
    Ответ написан
  • Топ игроков. Как вывести место конкретного игрока?

    @kfuntov
    SELECT score,
           (SELECT COUNT(*)
              FROM table AS p
             WHERE p.score <= t.score) AS position
     FROM table AS t WHERE id=@id;


    По мотивам stackoverflow.com/questions/3614666/mysql-get-row-...
    Ответ написан
  • Как правильно получить суммирующую таблицу из двух?

    @kfuntov
    Все валюты есть в обоих таблицах? Или какой-то из валют где-то может не быть?
    Если в ПРИХОДАХ есть все виды валют, то можно так:
    SELECT
           p.валюта as ВАЛЮТА,
           p.tot as ПРИХОДОБЩИЙ,
           r.tot as РАСХОДОБЩИЙ,
           (p.tot - r.tot) as ОСТАТОК
    FROM 
        ( SELECT SUM(приход) as tot, валюта FROM ПРИХОДЫ GROUP BY валюта ) as p
      LEFT JOIN 
          ( SELECT SUM(расход) as tot, валюта FROM РАСХОДЫ GROUP BY валюта ) as r
         ON r.валюта = p.валюта


    Если в "ПРИХОДАХ" может не быть каких-то валют,то нужен FULL JOIN, вместо LEFT.
    MySQL его сама не умеет, но способов его реализовать несколько, например:
    UNION LEFT и RIGHT JOIN-ов - самый короткий/понятный/красивый вариант, но при большом количестве валют может начать тормозить, так как UNION делает сортировку.
    SELECT
           p.валюта as ВАЛЮТА,
           p.tot as ПРИХОДОБЩИЙ,
           r.tot as РАСХОДОБЩИЙ,
           (p.tot - r.tot) as ОСТАТОК
    FROM 
        ( SELECT SUM(приход) as tot, валюта FROM ПРИХОДЫ GROUP BY валюта ) as p
      LEFT JOIN 
          ( SELECT SUM(расход) as tot, валюта FROM РАСХОДЫ GROUP BY валюта ) as r
         ON r.валюта = p.валюта
    UNION
    SELECT
           p.валюта as ВАЛЮТА,
           p.tot as ПРИХОДОБЩИЙ,
           r.tot as РАСХОДОБЩИЙ,
           (p.tot - r.tot) as ОСТАТОК
    FROM 
        ( SELECT SUM(приход) as tot, валюта FROM ПРИХОДЫ GROUP BY валюта ) as p
      RIGHT JOIN 
          ( SELECT SUM(расход) as tot, валюта FROM РАСХОДЫ GROUP BY валюта ) as r
         ON r.валюта = p.валюта

    Если производительность в данном месте требует оптимизации (советую сильно подумать, прежде, чем отвечать "да"), то можно усложнять запрос, делая его быстрее.
    Например, заменить UNION на UNION ALL и во второй части не выбирать значения, которые есть в первой.
    Ответ написан
    3 комментария
  • Как выбрать с двух таблиц MySQL?

    @kfuntov
    SELECT
        p.*,
        NOT ISNULL(wl.product_id)
    FROM product as p
    LEFT JOIN wishlist as wl ON p.id = wl.product_id;

    UPDATE спасибо @AxisPod (действительно IFNULL смотрел, не подошла, а ISNULL - то, что надо)
    Ответ написан
    1 комментарий