Ответы пользователя по тегу SQL
  • Как вывести уникальные записи из трёх таблиц?

    @FirststepsRu
    Что то на ум не приходит в один запрос. Надо слить все значения ticker в одну таблицу, затем выбрать только уникальные, и потом из основных таблиц выбрать по ним данные.

    Как-то так:
    CREATE TEMPORARY TABLE all_ticker (`ticker` varchar(16) NOT NULL);
    INSERT INTO all_ticker SELECT ticker FROM table1;
    INSERT INTO all_ticker SELECT ticker FROM table2;
    INSERT INTO all_ticker SELECT ticker FROM table3;
    
    CREATE TEMPORARY TABLE uniq_ticker (`ticker` varchar(16) NOT NULL)
        SELECT ticker FROM all_ticker GROUP BY ticker HAVING count(*) = 1;
    
    SELECT * FROM table1 t1 JOIN uniq_ticker u ON t1.ticker = u.ticker;
    SELECT * FROM table2 t2 JOIN uniq_ticker u ON t2.ticker = u.ticker;
    SELECT * FROM table3 t3 JOIN uniq_ticker u ON t3.ticker = u.ticker;
    
    DROP TEMPORARY TABLE all_ticker, uniq_ticker;
    Ответ написан
    Комментировать
  • DELETE FROM list WHERE id = 'id строки в списке дел'. Как мне указать этот id?

    @FirststepsRu
    Ошибка в генерации URL для удаления
    <a href="delete.php?id=notesDelete=' . $row['id']  . '">

    Тут ошибочное id=notesDelete=N. По коду delete.php должно быть delete.php?notesDelete=N
    Но скорее всего хотелось сделать что-то типа
    echo "<a href=delete.php?id=",$row['id'],"&notesDelete=1><button>delete</button></a>";

    Тогда delete.php мог бы выглядеть так
    if (!isset($_GET['id'])) die("Error: not found id parameter");
    $id = intval($_GET['id']);
    if ($id == 0) die("Error: wrong id parameter value");
    if (isset($_GET['notesDelete'])) {
          $dbc = mysqli_connect('localhost', 'root', '', 'notes') or die('Connect error...');
          $query = "DELETE FROM note WHERE id = ".$id;
          $result = mysqli_query($dbc, $query);
          mysqli_close($dbc);
    } else {
          die("Error: no any action found");
    }

    Хотелось сделать важное замечание для начинающего. Ваш изначальный код не защищен от так называемых SQL инъекций. Вот пример кода
    $id = intval("SELECT nothing"); var_dump($id);
    $id = intval("1312; DELETE something"); var_dump($id);
    $h = "DELETE FROM note WHERE id = '$id'";
    var_dump($h);
    $id = "10'; DROP DATABASE mysql; SELECT * FROM note WHERE id='1";
    $h = "DELETE FROM note WHERE id = '$id'";
    var_dump($h);

    Выведет
    int(0)
    int(1312)
    string(34) "DELETE FROM note WHERE id = '1312'"
    string(80) "DELETE FROM note WHERE id = '10'; DROP DATABASE mysql; SELECT * from note id='1'"

    То есть если злоумышленник подставит в URL текст с DROP DATABASE то сможет нарушить работу программы или получить какие-то секретные данные.
    Я в коде продемонстрировал как можно от этого себя обезопасить, это принудительно привести тип входных данных к требуемому для работы, в данном случае к целому числу intval(). Таким образом все непонятное будет обрезано или пребразовано к 0. Для строковых выражений обязательно применять экранирование с помощью mysqli_real_escape_string().
    Но более лучшей практикой в таком случае будут так называемые "подготовленные запросы SQL" о создании которых упомянул alexalexes, но не пояснил почему так надо делать.
    Ответ написан
    1 комментарий