Mysql не могу вывести id

Как вывести данные из MySQL – руководство для не шаманов

Дата публикации: 2016-04-25

От автора: что вы мобильник так трясете? Письмо пришло на почтовый ящик, а вы его прочитать не можете? Понятно! Вы бы еще, чтобы вывести данные из MySQL, с бубном возле ПК побегали. После «изъятия» письма этим и собирались заняться, и даже бубен прихватили? Ну ладно, не буду мешать. А для остальных «не шаманов» расскажу, как «вынуть» данные из MySQL без бубна.

Средства вывода phpMyAdmin

Отложите пока в сторону бубен, глаза ползучего питона и ожерелье из мухоморов. Опробуем для получения информации из БД менее «магические» способы. Начнем с рассмотрение возможностей, которые предоставляет для этого оболочка phpMyAdmin. Запускаем программу, слева в списке выбираем нужную базу. Чтобы вывести данные из таблицы MySQL, в основном верхнем меню переходим в раздел «Обзор». После этого получаем содержимое выбранной таблицы.

В результате нам удалось в три щелчка получить доступ к содержимому нужной базы данных. Но что-то выбранная для экспериментов БД уж слишком приелась. Конечно, все мы любим «зверюшек», но от наших «танцев с бубнами» они все быстро разбегутся. Нелегкое это дело «шаманство»

Читайте также:  Как дома вывести птенцов

Чтоб не мучатся с созданием новой БД и не тратить понапрасну драгоценное время, скачаем готовую базу с официального ресурса MySQL. А сэкономленные таким образом минуты потратим на обучение «волшебству» администрирования СУБД. Установка скачанной базы происходит в phpMyAdmin через вкладку «Импорт».

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

Импортированная БД «World» содержит намного больше информации, и поэтому более интересна для обучения (на случай, если мы заскучаем во время освоения материала). Ее «потенциал» можно увидеть, открыв любую из ее таблиц. Например, «City»:

Окунаемся в язык структурированных запросов

Все это интересно, но что делать, если нужно вывести строку MySQL, а не полностью таблицу? Визуально найти среди сотни строк искомую практически невозможно. Для этого нужно воспользоваться средствами SQL.

В языке структурированных запросов для вывода отсортированных данных используется оператор SELECT. Его синтаксис:

Приведем пример SQL запроса к таблице «city». Например, нам нужно вывести строку, в которой значение столбца id равно 670:

Запрос на вывод из базы данных MySQL мы начинаем указанием команды (SELECT). Затем звездочкой (*) мы «говорим» СУБД, что хотим сделать выборку всех значений строки из (FROM) таблицы city, где значение столбца id равно заданному значению ( id =670). Вводим запрос в окно редактора (вкладка «SQL»). Вот какой результат возвращает нам сервер:

Сервер возвратил нам строку, отвечающую заданным в запросе критериям. Выше система выводит код запроса, а также автоматически добавляет к нему свою часть. По умолчанию, с помощью директивы ORDER BY программа (НЕ СУБД) сортирует результаты выборки по значению столбца Name ( city . Name ). При этом значения столбца сортируются по возрастанию (параметр ASC).

Обратите внимание на «тонкости» синтаксиса (написания) запросов на вывод таблиц MySQL. Названия имя таблицы экранируются не одинарными кавычками, а грависом. Он является знаком слабого ударения. На клавиатуре он расположен на клавише с буквой «Ё».

Это важно, поскольку при использовании одинарных кавычек система MySQL буде выдавать ошибку о нарушении синтаксиса
написания команды запроса. Для наглядности попробуйте сами. В результате увидите следующий результат:

Выборка данных из кода PHP

Теперь постараемся произвести вывод данных из MySQL в PHP. Отобразим на экране ту же строку, полученную в предыдущем запроса. Вот код примера:

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

$id — $name — $country_code — $district — $population

В результате выгрузки MySQL мы получили ту же самую строку:

Но что, если нужно отобразить всю таблицу? Для этого придется немного изменить код SQL запроса:

Вот, что мы вывели в браузере:

То есть, мы отобразили все данные таблицы целиком. Но они слишком громоздки, и могут не помещаться в экранной области браузера. С помощью оператора LIMIT в запросе можно задать, какие строки выводить (с какой по какую). Например, нам нужно просмотреть данные с 1 по 10 строки. Тогда запрос для вывода страницы из MySQL будет выглядеть так:

Обратите внимание, что для использования в PHP мы указываем имя базы и таблицы через точку, отдельно экранировав друг от друга.

Экспорт БД

О том, как экспортировать базу данных MySQL, мы подробно рассказывали в одном из наших предыдущих материалов. Сегодня мы рассмотрим вариант переноса данных различных форматов. Чаще всего требуется импортировать информацию в SQL из CSV и наоборот.

На самом деле CSV является обычным текстовым форматом, в котором все строки разделены запятыми. Он идеально подходит для переноса информации в интернете, поскольку файлы в этом формате «весят» в несколько раз меньше. Кроме этого CSV легко расширяем, что позволяет в одном файле поместить нужное количество БД и при необходимости добавлять новые.

Для переноса информации из этого формата в MySQL в веб-программированию пишутся большие куски кода, описанию которых придется посвятить отдельную статью. Но мы пойдем по иному пути, и рассмотрим, как экспортировать данные из CSV в MySQL с помощью phpMyAdmin.

Заходим в оболочку. В основном меню сверху переходим в раздел «Импорт». Затем «Импортируемый файл». Указываем через «Обзор вашего компьютера» нужный файл, формат и жмем внизу «Ок».

Импорт данных окончен. Теперь осталось задать структуру таблиц и тип данных столбцов.

Как видите, чтобы вывести данные из MySQL, не обязательно быть шаманом и плясать под звуки бубна. Нам для этого хватило возможностей, предоставляемых СУБД. Кстати, для «изъятия» письма из телефона бубен тоже не нужен

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

Источник

Можно ли получить id вставленных элементов в mysql одной командой insert?

Использую mysqli в php .

При вставке одной записи командой insert , можно получить id вставленной записи. Если же командой insert вставлять несколько записей, то получаю все равно один id первой вставленной записи.

Можно ли получить id сразу всех вставленных записей командой insert в mysql ?

3 ответа 3

Ниразу такого не делал, но если бы встала задача, то попробовал бы через цикл вывести mysqli_insert_id начиная с последнего в том количестве id которое было добавлено. Тоесть если добавилось 3 id то сделать цикл, который выводит id с конца 3 штуки.

Особо не пинайте. Для комментов не хватет 2 балла)

Вставка нескольких записей (выполняется из PHP-кода):

Получение id первой из вставленных записей (тоже из PHP-кода, возможно, таким запросом или иным способом):

Допустим, полученный id мы положили в переменную $id. Количество вставленных записей нам известно, допустим, оно находится в переменной $count Теперь надо получить массив id всеx вставленных записей. Это можно попробовать сделать запросом:

PS. Допускаю, что способ некорректен и может дать неверный результат в многопользовательской среде. Но пока я лично с таким не сталкивался.

У mysql нет какого-либо эквивалента insert .. returning , а LAST_INSERT_ID возвращает только один элемент. Поэтому за один запрос — никак, разве только полагаться на детали внутреннего устройства auto_increment .

Имеет смысл не гнаться за одним запросом, а в одной транзакции воспользоваться prepared statement и вставить необходимое число строк.

Что проще по коду нежели собирание одного огромного insert , из-за единой транзакции имеет сопоставимый уровень изоляции видимости и число дисковых операций. Остальные ресурсы необходимо измерять, может быть медленнее, может быть равноценно, может даже быть быстрее одного большого запроса — если за счёт prepared statements получится сэкономить достаточно ресурсов на разборе текста запроса.

Источник

Можно ли получить id вставленных элементов в mysql?

Для InnoDB (движок гарантирует последовательную вставку для полей с AUTO_INCREMENT):
1. Выставить настройку innodb_autoinc_lock_mode=1 (по умолчанию)
2. Cделать INSERT.
3. Получить LAST_INSERT_ID().
4. Получить ROW_COUNT().
5. Сгенерировать id записей на основании двух предыдущих пунктов.

Для всех:
1. Добавить поле «batch_id» с индексацией по нему.
2. При подготовке данных всем элементам пачки поставить сгенерированный batch_id
3. После INSERT сделать SELECT по bacth_id

  1. открыть транзакцию
  2. добавить записи
  3. подтвердить транзакцию
  4. получить текущий AUTO_INCREMENT
  5. получть insert_id

* Теоретически, id добавленных записей [insert_id. AUTO_INCREMENT-1]

Одна из причин по которой лично я перешел на Postgresql. Там есть RETURNING который может вернуть любое поле из вставленной строки, не только ID. Если нет ни каких специфичных кейсов использовать РСУБД, то переход получается простой.

Касательно контексте задачи. Предположу, что нужно фронту/клиенту получить идентификаторы вставляемых записей. Но решить указанную проблему можно зайдя с другой стороны. Идентификаторы генерировать на клиенте (т.е. условый ID записей известны уже ДО вставки в базу). В качестве такого идентификатора лучше использовать UUID реализация которого есть абсолютно во всех популярных языках.

Источник

Изобретая велосипед или поиск отсутствующего значения ID в MySQL таблице

Разработчики и администраторы систем основанных на sql данных, наверняка, сталкивались с задачей — получить отсутствующее (пропущенное) значение в ряде id записей таблицы. Например номер договора, порядковый номер документа, телефонный номер, айпи-адрес и т.п. При работе с MySQL эта тривиальная задача непропорционально ресурсоемка.

Например, у нас есть пул внутренних телефонных номеров компании от 2001 до 2999 и таблица с выданными из них номерами для сотрудников:

  • t1.phone
  • 2001
  • 2002
  • 2003
  • 2004
  • 2005
  • 2009
  • 2015
  • 2016

Нам нужно найти первое свободное значение (в данном случае 2006) чтобы выделить очередной номер очередному сотруднику. Если свободных значений нет, то нужно выделить следующий из диапазона. Знакомая задача? Решения, которыми изобилует интернет, сводятся к двум принципам:

1) Делать перебор в цикле: например в SQL создать курсор CUR i+1 c 2001 до 2999 и делать запросы до пустого значения. Цикл можно делать и любым внешним софтом, смысл принципа не меняется.

2) Второй принцип, использовать LEFT (OUTER) JOIN последовательности 2001. 2009 с таблицей t1 (WHERE t1.phone IS NULL конечно же), либо таблицы t1 с собой же со сдвигом на шаг:

Еще один вариант с использованием IN вообще не рассматриваю из-за громоздкости.

На маленьких объемах данных оба решения (и даже с IN) прекрасно работают, а при большом количестве записей эти решения либо ресурсоемки, либо продолжительны во времени, либо и то и другое.
Зависит от мощностей сервера и настроек базы, но в любом случае если перебирать миллион записей или приджойнить такую таблицу, даже на мощном сервере выполнение займет заметное время.

Я же захотел решить задачу быстро, не напрягая сервер, и, желательно, в один запрос. В один, не в один, но вот что получилось:

По сравнению с джойнами простые селекты выполняются в сотни раз быстрее.

Понятное дело, что такое решение известно, но в интернетах, как ни странно, с наскока его найти не удалось, вот и хочу поделиться эти простым «велосипедом».

UPD.
Прекрасное решение подсказал в личке участник stepmex
Без всякого дополнительного построения нумерации и сравнений рядов, изящно решил задачу через (SELECT 1 . ) IS NULL
Великолепная находка, я считаю:

Источник

SELECT, SELECT DISTINCT. Вывод данных из таблиц в MySQL

Команда SELECT

SELECT используется для создания выборок из базы данных MySQL.

С помощью SELECT можно:

  • выводить данные из одной или нескольких таблиц и колонок.
  • вывести все данные из таблицы используя оператор * .
  • выводить данные с условием, используя команду WHERE .
  • ограничить количество выводимых записей, используя команду LIMIT .
  • задать смещение колонок, используя команду OFFSET .

Синтаксис запроса вывода данных из таблицы

В запросе мы выбираем из каких колонок (column1, column2, . ) какой таблицы (table_name) мы хотим получить данные.

Если нужно получить данные всех колонок таблицы, то воспользуйтесь оператором * .

Вывод данных таблицы в терминале

Пример вывода данных колонок id, title, author, price, amount из таблицы books.

mysql> USE Bookstore;
Database changed

mysql> SELECT id, title, author, price, amount FROM books;
+—-+—————————+———————+———+———+
| id | title | author | price | amount |
+—-+—————————+———————+———+———+
| 1 | Дубровский (Акция) | Александр Пушкин | 230.00 | 20 |
| 2 | Нос (Акция) | Николай Гоголь | 255.20 | 7 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 | 8 |
| 4 | Мёртвые души (Акция) | Николай Гоголь | 173.00 | 3 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 | 3 |
| 6 | Война и мир | Лев Толстой | 341.00 | 1 |
| 7 | Анна Каренина | Лев Толстой | 346.00 | 0 |
| 8 | Отцы и дети | Иван Тургенев | 371.00 | 3 |
| 9 | Собачье сердце | Михаил Булгаков | 232.00 | 10 |
| 10 | Бесы | Фёдор Достоевский | 212.00 | 8 |
+—-+—————————+———————+———+———+
10 rows in set (0.00 sec)

Запрос для вывода данных всех колонок из таблицы books, будет выглядеть так.

Вывод данных можно также организовать не только в виде таблицы, но и в виде списка, просто добавьте флаг \G после имени таблицы.

mysql> SELECT * FROM books \G;
*************************** 1. row ***************************
id: 1
title: Дубровский (Акция)
author: Александр Пушкин
genre: Драма,Повесть
price: 230.00
discount: 15
edition: 1
isbn: 841-6-817-134484-1
page_num: 120
publish_year: 1855
creation_date: 2019-01-28 15:17:12
amount: 20
shelf_position: f4a322ccca

Вывод данных из нескольких таблиц

Если у вас есть несколько связанных таблиц, то с помощью SELECT вы можете выводить их данные составляя из них одну таблицу.

Например мы имеем таблицу с книгами — books и их заказами — orders.

Выведем колонки id, book_id и status для таблицы orders.

Имея идентификаторы записей таблицы books в колонке book_id, мы можем соотнести их с колонкой id в таблице books с помощью команды WHERE . В результате мы можем узнать статус заказа для каждой книги.

Выведем колонки title, author, price из таблицы books и колонку status из таблицы orders.

mysql> SELECT title, author, price, status FROM books, orders WHERE books.id=book_id;
+———————+——————-+———+——————+
| title | author | price | status |
+———————+——————-+———+——————+
| Мастер и Маргарита | Михаил Булгаков | 263.00 | Новый |
| Дубровский (Акция) | Александр Пушкин | 230.00 | Обрабатывается |
+———————+——————-+———+——————+
2 rows in set (0.00 sec)

Вывести колонки с одинаковыми именами, например id, в данном случае не получится, т.к. они имеются в обоих таблицах.

Команда SELECT DISTINCT

В отличие от обычного SELECT , SELECT DISCTINCT позволяет выводить только уникальные (не повторяющиеся) данные из таблицы БД.

Источник

Оцените статью