Ответы пользователя по тегу MySQL
  • MySQL выбор из 4х таблиц как?

    @kfuntov
    SELECT b.*
    FROM magazine -brands AS b
    INNER JOIN magazine -product_brands AS pb ON pb.brand = b.id
    INNER JOIN magazine -product_category AS pc ON pc.product = pb.product
    WHERE pc.category = #ID ИСКОМОЙ КАТЕГОРИИ#
    Ответ написан
  • Как оптимизировать php скрипт?

    @kfuntov
    Что значит "правильно оптимизировать"?
    Тут всё написано так, что должно выполнятся быстро.
    Есть ряд вещей не очень направленных на оптимизацию, а именно:
    1. Нет проверки на то, что $userdata пустой (на случай, если у пользователя в куках был user_Id, которого в базе нету, например 9999999).
    2. В таком случае избыточная проверка $userdata['user_id'] !== $_COOKIE['id'] - сначала делается запрос "дай мне пользователя с таким id", а потом проверяется "тот ли id ты мне дал?"
    3. В строке print "Привет, ".$userdata['user_login'].". Всё работает!".$userdata['user_balance'].; - явно лишняя последняя точка.
    4. mysql_* функции считаются плохими для использования. ВСЕ нормальные люди советуют использоватьPDO или MySQLi (в том числе и сайт php.net).

    Про преобразование в html: то, что получается на выходе того скрипта - уже html. без тегов, но в принципе html.
    Если нужно добавить теги - это можно сделать, но тут надо понимать, что надо получить. Если важно просто "чтобы был html", то поздравляю, он есть.
    Ответ написан
    1 комментарий
  • Как правильно получить суммирующую таблицу из двух?

    @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 комментарий
  • Почему не передается переменная?

    @kfuntov
    После обновления вопроса (добавления globals.php) стало всё ясно.

    Есть такая штука, как область видимости, она нужна, чтобы случайно не перетереть что-то.
    Переменные внутри функции должны быть:
    * Переданы в неё, в качестве аргументов
    * Определнены в ней
    * Объявлены, как global
    Побробнее об области видимости тут www.php.net/manual/ru/language.variables.scope.php
    Только не надо писать слово global, пожалуйста!!!! (Это очень плохая практика)
    Лучше всего модифицировать функцию tryQuery , добавив ей $sql в качестве аргумента
    function tryQuery($sql) {
        var_dump($sql); #Получается NULL.
        $result = $sql->query("SELECT * FROM users");
        var_dump($result); #Получается NULL.
        
        return $result;
    }


    А при вызове её - передавать в неё $sql .

    Старый ответ:
    Лучше ещё хотя бы начало globals и то, как ты это запускаешь.
    (Пока всё выглядит нормально)
    Возможно db.php не инклюдится (относительный адрес, например). Попробуй в db.php добавить
    echo "HERE I AM!";
    И посмотреть, будет ли надпись. Если её нет, проблема с инклюдом.
    Ответ написан
    1 комментарий