Как использовать внешний ключ при запросе из двух таблиц

Пример оператора неравенства

В MySQL вы можете использовать операторы или !=. Для проверки неравенства в запросе.

Например, мы могли бы проверить неравенство с помощью оператора следующим образом:

MySQL

SELECT *
FROM contacts
WHERE last_name <> ‘Bernard’;

1
2
3

SELECT*

FROMcontacts

WHERElast_name<>’Bernard’;

В этом примере оператор SELECT вернет все строки из таблицы contacts, где last_name не равно Bernard.

Или вы также можете написать этот запрос с помощью оператора != следующим образом:

MySQL

SELECT *
FROM contacts
WHERE last_name != ‘Bernard’;

1
2
3

SELECT*

FROMcontacts

WHERElast_name!=’Bernard’;

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

Просмотр рядом, чтобы сравнить таблицы.

Если у вас относительно небольшие файлы и вы внимательны к деталям, этот быстрый и простой способ сравнения может вам подойти. Я говорю о режиме «Просмотр рядом», который позволяет расположить два окна Excel рядом. Вы можете использовать этот метод для визуального сравнения двух таблиц или двух листов из одной книги.

Сравните 2 книги.

Предположим, у вас есть отчеты о продажах за два месяца, и вы хотите просмотреть их оба одновременно, чтобы понять, какие товары показали лучшие результаты в этом месяце, а какие — в прошлом.

Чтобы просмотреть два файла Эксель рядом, сделайте следующее:

  1. Откройте оба файла.
  2. Перейдите на вкладку «Вид» и нажмите кнопку «Рядом. (1) Это оно!

По умолчанию два отдельных окна Excel отображаются горизонтально.

Чтобы разделить окна по вертикали, нажмите кнопку «Упорядочить все» (3) и выберите «Рядом (4):

В результате два отдельных окна будут расположены, как на скриншоте.

Если вы хотите прокручивать оба листа одновременно, чтобы сравнивать данные строка за строкой, убедитесь, что параметр синхронной прокрутки (2) включен. Он обычно включается автоматически, как только вы активируете режим одновременного просмотра двух книг.

Расположите рядом несколько таблиц Excel.

Чтобы просматривать более двух файлов одновременно, откройте все книги, которые вы хотите сравнить, и нажмите кнопку «Рядом. 

Появится диалоговое окно «Сравнить рядом», в котором вы выберете файлы, которые будут отображаться вместе с активной книгой.

Чтобы просмотреть все открытые файлы одновременно, нажмите кнопку «Упорядочить все и выберите предпочтительное расположение: мозаичное, горизонтальное, вертикальное или каскадное.

Для небольших таблиц вы легко сможете визуально сравнить их данные. Хотя, конечно, риск ошибки из-за человеческого фактора здесь присутствует.

Сравните два листа в одной книге.

Иногда 2 листа, которые вы хотите сравнить, находятся в одной книге. Чтобы просмотреть их рядом, выполните следующие действия.

  1. Откройте файл, перейдите на вкладку «Вид» и нажмите кнопку «Новое окно.
  1. Это действие откроет тот же файл в дополнительном окне.
  2. Включите режим просмотра «Рядом», нажав соответствующую кнопку на ленте.
  3. Выберите лист 1 в первом окне и лист 2 во втором окне.

Сравнение при помощи сводной таблицы.

Хороший вариант сравнения — объединить таблицы в единую сводную, и там уже сопоставлять данные между собой.

Вернемся к нашему примеру с двумя прайс-листами. Объединим наши данные на одном листе. Чтобы отличить данные одной таблицы от другой, добавим вспомогательный столбец D и укажем в нем, откуда именно взяты данные:

А теперь приступим к созданию сводной таблицы. Я не буду подробно останавливаться на том, как мы это будем делать. Все шаги подробно описаны в статье Как сделать сводную таблицу в Excel.

Поместим поле Товар в область строк, поле Прайс в область столбцов и поле Цена в область значений.

Как видно на скриншоте ниже, для каждого товара, встречающегося хотя бы в одном из прайсов, указана цена.

Сводная таблица автоматически сформирует общий список всех товаров из старого и нового прайсов и сортирует их по алфавиту. Причём, без повторов. У новых товаров нет старой цены, у удаленных товаров — новой цены. Легко увидеть изменения цен, если таковые были.

Общие итоги здесь смысла не имеют, и их можно отключить на вкладке Конструктор — Общие итоги — Отключить для строк и столбцов.

Если изменятся цены, то достаточно просто обновить созданную сводную, щелкнув по ней правой кнопкой мыши — Обновить. А вот если изменится список товаров или добавится новый файл для сравнения, то придется заново формировать исходный массив или же добавлять в него новые данные.

Плюсы: такой подход на порядок быстрее работает с большими объемами данных, чем ВПР. Можно сравнить данные нескольких таблиц.

Минусы: надо вручную копировать данные в одну большую таблицу и добавлять столбец с названием исходного файла.

Описание

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

Операторы сравнения Описание
= Равно
Равно (безопасное сравнение значения NULL)
, != Не равно
> Больше, чем
>= Больше или равно
Меньше, чем
Меньше или равно
IN ( ) Соответствует значению в списке
NOT Отрицает условие
BETWEEN В пределах диапазона (включительно)
IS NULL Значение NULL
IS NOT NULL Значение, не NULL
LIKE Соответствие шаблону % и _
EXISTS Условие выполняется, если подзапрос возвращает хотя бы одну строку

Рассмотрим примеры операторов сравнения, которые вы можете использовать в MySQL.

Как сравнить две таблицы при помощи формулы ВПР.

Предположим, у нас снова 2 прайс-листа. Однако, в отличие от предыдущего примера, они содержат разное количество товаров, да и сами товары расположены в произвольном порядке. Поэтому описанный выше способ, когда мы построчно сравнивали две таблицы, здесь не сработает.

Нам необходимо последовательно взять каждый товар из одной таблицы, найти его во второй, извлечь оттуда его цену и сравнить с первоначальной ценой. Здесь нам не обойтись без формул поиска. Поможет нам функция ВПР.

Для наглядности расположим обе таблицы на одном листе.

Формула

берёт наименование товара из второго прайса, ищет его в первом, и в случае удачи извлекает соответствующую цену из первой таблицы. Она будет записана рядом с новой ценой в столбце H. Если поиск завершился неудачей, то есть такого товара ранее не было, то ставим 0. Таким образом, старая и новая цена оказываются рядом, и их легко сравнить простейшей операцией вычитания. Что и сделано в столбце I.

Аналогично можно сопоставлять и данные на разных листах. Просто нужно соответствующим образом изменить ссылки в формуле, указав в них имя листа.

Вот еще один пример. Возьмём за основу более новую информацию, то есть второй прайс. Выведем только сведения о том, какие цены и на какие товары изменились. А то, что не изменилось, выводить в итоговом отчёте не будем.

Разберём действия пошагово. Формула в ячейке J3 ищет наименование товара из первой позиции второй таблицы внутри первой. Если таковое найдено, извлекается соответствующая этому товару старая цена и сразу же сравнивается с новой. Если они одинаковы, то в ячейку записывается пустота «». 

Таким образом, в ячейке J3 будет указана старая цена, если ее удастся найти, а также если она не равна новой.

Далее если ячейка J3 не пустая, то в I3 будет указано наименование товара —  

а в K3 – его новая цена:  

Ну а далее в L3 просто найдем разность K3-J3.

Таким образом, в отчёте сравнения мы видим только несовпадения значений второй таблицы по сравнению с первой.

И еще один пример, который может быть полезен. Попытаемся сравнить в итоговой таблице оба прайс-листа с эталонным общим списком товаров.

В ячейке B2 запишем формулу

Так мы выясним, какие цены из второй таблицы встречаются в первой.

Для каждой цены из первого прайса проверяем, совпадает ли она с новыми данными  —

Эталонный список находится у нас в столбце A. В результате мы получили своего рода сводную таблицу цен – старых и новых.

Как произвести сравнение на отдельном листе.

Чтобы сравнить два листа Эксель на предмет различий, просто откройте новый пустой лист, введите следующую формулу в ячейку A1, а затем скопируйте ее вниз и вправо, перетащив маркер заполнения:

Поскольку мы используем относительные ссылки на ячейки, формула будет меняться в зависимости от расположения столбца и строки. В результате формула в A1 будет сравнивать ячейки A1 в Лист1 и Лист2, формула в B1 будет сравнивать ячейку B1 на обоих листах и ​​так далее. Результат будет выглядеть примерно так:

В результате вы получите отчет о различиях на новом листе. Думаю, это достаточно информативно.

Как вы можете видеть на приведенном выше рисунке, формула сравнивает 2 листа, находит ячейки с разными значениями и отображает различия в соответствующих местах. 

Обратите внимание, что в отчете о различиях (ячейка D4) даты представлены числами, поскольку в таком виде они хранятся во внутренней системе Excel, что не очень удобно для анализа различий между ними

Оператор UNION – Объединение

Для объединения запросов используется следующий синтаксис:

По умолчанию оператор удаляет повторяющиеся строки из результирующего набора. Если указан параметр ALL, то результат будет содержать все строки, в том числе повторяющиеся.

Объединяемые запросы должны быть совместимы между собой. В терминологии SQL это обозначает, что:

  • Таблицы должны иметь одинаковое количество столбцов.
  • Типы данных в соответствующих столбцах должны быть совместимыми.

Объединяемые запросы должны быть совместимы между собой. В терминологии SQL это обозначает, что:

  • Таблицы должны иметь одинаковое количество столбцов.
  • Типы данных в соответствующих столбцах должны быть совместимыми.

При объединении данных из столбцов с разными именами результирующему столбцу присваивается имя столбца из первого запроса.

К результату объединения рекомендуется применять предложение , где можно ссылаться только на имена столбцов левого запроса в операторе .

Пример 4.Пусть задана таблица P1.

Номер Наименование
5 Орлов

Определим результат следующего объединения:

Номер Наименование
1 Иванов
5 Орлов

Пример 5.Получить номера деталей, цена которых более 20 рублей или суммарное поставляемое количество более 500 штук.

Запрос разбивается на две части:

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

Результирующая таблица получается при объединении двух частей запроса.

Пример 6.Вывести информацию о деталях. В том случае если цена детали не указана вывести ‘цены нет’.

Запрос разбивается на две части:

  • Вывод информации о деталях, для которых указана цена.
  • Вывод информации о деталях, для которых не указана цена. В этом случае в предложении вместо атрибута dprice нужно указывать строковую константу ‘цены нет’.

Быстрое выделение значений, которые различаются.

Это также не очень обременительный способ. Если вам просто нужно найти и удостовериться в наличии или же отсутствии отличий между записями, вам нужно на вкладке «Главная», выбрать кнопку «Найти и выделить», предварительно выделив диапазон, где надо сравнить данные в Эксель.

В открывшемся меню выберите пункт «Выделить группу ячеек…» и в появившемся диалоговом окне выберите «отличия по строкам».

К сожалению, это нормально работает только для сравнения 2 столбцов (или строк), а не всей таблицы целиком. Кроме того, строки должны быть одинаковым образом отсортированы, поскольку ячейки сравниваются построчно. Если у вас товары отсортированы по-разному, либо вообще различный ассортимент, то никакой пользы от этого метода не будет.

Подстановка нескольких значений из другой таблицы

Необходимость в данном запросе не является повседневной, но возникает не совсем уж и редко. Самый распространенный пример, это обычная сетевая игра. Где создается сессия на два игрока. Соответственно в таблице с данными об играх имеются два поля с идентификаторами зарегистрированных игроков. Для того чтобы вывести информацию об имеющихся играх, мы не можем обойтись стандартным объединением таблицы с данными об игроках и таблицы об имеющихся играх. Так как мы имеем два поля с идентификаторами неких игроков. Но мы можем обратиться опять за помощью к псевдонимам таблиц.

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

CREATE TABLE IF NOT EXISTS `replace_com` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sProductID` int(11) NOT NULL,
  `rProductID` int(11) NOT NULL,
  `Date` date NOT NULL DEFAULT '0000-00-00',
  PRIMARY KEY (`id`),
  KEY `sProductID` (`sProductID`,`rProductID`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf-8 AUTO_INCREMENT=4 ;

Предположим, что у нас есть некий компьютерный салон и мы проводим модификации некоторых компьютерных составляющих, а все операции по замене комплектующих заносим в базу данных. В таблице replace_com интересующими нас полями являются: sProductID и rProductID. Где sProductID – идентификатор заменяемого модуля, а rProductID – идентификатор заменяющего модуля. Запрос, реализующий вывод данных о совершенных операциях выглядит следующим образом:

SELECT sProducts.Name AS sProduct, rProducts.Name AS rProduct, 
replace_com.Date FROM replace_com JOIN products AS sProducts ON 
sProducts.id = replace_com.sProductID JOIN products AS rProducts ON 
rProducts.id = replace_com.rProductID

Результирующая таблица данных:

+-----------------------+------------------------+------------+
| sProduct              | rProduct               | Date       |
+-----------------------+------------------------+------------+
| Процессоры Pentium II | Процессоры Pentium III | 2014-09-15 |
| Flash RAM 4Gb         | Flash RAM 8Gb          | 2014-09-17 |
| DVD-R                 | DVD-RW                 | 2014-09-18 |
+-----------------------+------------------------+------------+

Формула сравнения.

Это самый простой способ соотнесения таблиц в Excel, который позволяет идентифицировать в них ячейки с разными значениями. 

Простейший вариант – сопоставление двух таблиц, находящихся на одном листе. Можно соотносить как числовые, так и текстовые значения, всего-навсего прописав в одной из соседних ячеек формулу их равенства. В результате при тождестве ячеек мы получим сообщение ИСТИНА, в противном случае — ЛОЖЬ.

Предположим, у нас имеется два прайс-листа (старый и новый), в которых на некоторые товары различаются цены. При этом порядок следования товаров одинаков. Поэтому мы можем при помощи простейшей формулы прямо на этом же листе сравнить идентичные ячейки с данными.

Результатом будет являться либо ИСТИНА (в случае совпадения), либо ЛОЖЬ (при отрицательном результате).

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

Если ваши таблицы достаточно велики, то довольно утомительно будет просматривать колонку I на предмет поиска слова ЛОЖЬ. Поэтому может быть полезным сразу определить — а есть ли вообще несовпадения?

Можно подсчитать общее количество расхождений и сразу вывести это число где-нибудь отдельно.

или можно сделать это формулой массива

Если формула возвращает ноль, значит, данные полностью совпадают. Ну а ежели результат положительный, то нужны более детальные исследования. О них мы и поговорим далее.

Пример оператора равенства (безопасный с нулевыми значениями)

Поскольку оператор = только сравнивает значения, отличные от NULL, использовать значения NULL небезопасно. Чтобы преодолеть это ограничение, MySQL добавил оператор, чтобы вы могли проверить равенство как со значениями NULL, так и с не NULL значениями.

Чтобы лучше объяснить разницу между оператором = и оператором , мы будем включать некоторые примеры как с запросами, так и с данными.

Предполагая, что у нас в MySQL есть таблица, называемая contacts, которая заполнена следующими данными:

contact_id last_name site1 site2
1 Arnold alexa.com
2 Gypsie
3 Boyson bing.com bing.com
4 Juan google.ru google.com

Мы могли бы использовать оператор = в следующем запросе:

MySQL

SELECT *
FROM contacts
WHERE site1 = site2;

1
2
3

SELECT*

FROMcontacts

WHEREsite1=site2;

Получим следующий результат:

contact_id last_name site1 site2
3 Boyson bing.com bing.com

В вышеприведенном примере оператор SELECT возвращает все строки из таблицы contacts, где site1 равен site2. Он не возвращает вторую запись, в которой значения site1 и site2 имеют значения NULL.

Теперь давайте посмотрим, что произойдет, когда мы перепишем наш запрос с помощью оператора , который безопасен для использования со значениями NULL:

MySQL

SELECT *
FROM contacts
WHERE site1 <=> site2;

1
2
3

SELECT*

FROMcontacts

WHEREsite1<=>site2;

Поскольку мы используем оператор , мы получим следующий результат:

contact_id last_name site1 site2
2 Gypsie
3 Boyson bing.com bing.com

Теперь наш запрос возвращает все строки из таблицы contacts, где site1 равен site2, включая те записи, где site1 и site2 имеют значения NULL.

Подстановочные знаки

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

Оператор указывает SQL, что необходимо сравнивать содержимое столб­ца с шаблоном «Smith% Corp.». Этому шаблону соответствуют все перечис­ленные ниже имена.

Smith Corp.

Smithsen Corp.

Smithson Corp.

Smithsonian Corp.

А вот эти имена данному шаблону не соответствуют.

SmithCorp                      

Smithson Inc.

Подстановочный знак (символ подчеркивания) совпадает с любым отдельным символом. Например, если вы уверены, что название компании либо «Smithson», либо «Smithsen», то можете воспользоваться следующим запросом.

В таком случае шаблону будет соответствовать любое из представленных ниже имен.

Smithson Corp.                      

Smithsen Corp.                      

Smithsun Corp.

А вот ни одно из следующих ему соответствовать не будет.

Smithsoon Corp.       

Smithsn Corp.

Подстановочные знаки можно помещать в любое место строки шаблона, и в одной строке может содержаться несколько подстановочных знаков. Следующий запрос допускает как написание «Smithson» и «Smithsen», так и любое другое окончание названия компании, включая «Corp.», «Inc.» или какое-то другое.

С помощью формы можно находить строки, которые не соответст­вуют шаблону. Проверку можно применять только к столбцам, имеющим строковый тип данных. Если в столбце содержится значение , то результатом проверки будет .

Вероятно, вы уже встречались с проверкой на соответствие шаблону в опера­ционных системах, имеющих интерфейс командной строки (таких, как Unix). Обычно в этих системах звездочка () используется для тех же целей, что и символ процента () в SQL, а вопросительный знак () соответствует символу подчеркива­ния () в SQL, но в целом возможности работы с шаблонами строк в них такие же.

Сравнение данных за две даты

Хотя данная статистика из рода задач довольно редко встречаемых, но все-таки необходимость в ее получении иногда существует. И получить такую статистику ничуть не сложнее других.

Работать мы будем с двумя таблицами, структура которых представлена ниже:

Структура таблицы products

CREATE TABLE IF NOT EXISTS `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ShopID` int(11) NOT NULL,
  `Name` varchar(150) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf-8 AUTO_INCREMENT=10 ;

Структура таблицы statistics

CREATE TABLE IF NOT EXISTS `statistics` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ProductID` bigint(20) NOT NULL,
  `Orders` int(11) NOT NULL,
  `Date` date NOT NULL DEFAULT '0000-00-00',
  PRIMARY KEY (`id`),
  KEY `ProductID` (`ProductID`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf-8 AUTO_INCREMENT=20 ;

Дело в том, что стандарт языка SQL допускает использование вложенных запросов везде, где разрешается использование ссылок на таблицы. Здесь вместо явно указанных таблиц, благодаря использованию псевдонимов, будут применяться результирующие таблицы вложенных запросов с имеющейся связью один – к – одному. Результатом каждой результирующей таблицы будут данные о количестве произведенных заказов некоего товара за определенную дату, полученные путем выполнения запроса на выборку данных из таблицы statistics по требуемым критериям. Иными словами мы свяжем таблицу statistics саму с собой. Пример запроса:

SELECT stat1.Name, stat1.Orders, stat1.Date, stat2.Orders, stat2.Date FROM 
(SELECT statistics.ProductID, products.Name, statistics.Orders, statistics.Date 
FROM products JOIN statistics ON products.id = statistics.ProductID WHERE 
DATE(statistics.date) = '2014-09-04') AS stat1 JOIN (SELECT statistics.ProductID, 
statistics.Orders, statistics.Date FROM statistics WHERE DATE(statistics.date) = 
'2014-09-12') AS stat2 ON stat1.ProductID = stat2.ProductID

В итоге имеем такой результат:

+------------------------+----------+------------+----------+------------+
| Name                   | Orders1  | Date1      | Orders2  | Date2      |
+------------------------+----------+------------+----------+------------+
| Процессоры Pentium II  |        1 | 2014-09-04 |        1 | 2014-09-12 |
| Процессоры Pentium III |        1 | 2014-09-04 |       10 | 2014-09-12 |
| Оптическая мышь Atech  |       10 | 2014-09-04 |        3 | 2014-09-12 |
| DVD-R                  |        2 | 2014-09-04 |        5 | 2014-09-12 |
| DVD-RW                 |       22 | 2014-09-04 |       18 | 2014-09-12 |
| Клавиатура MS 101      |        5 | 2014-09-04 |        1 | 2014-09-12 |
| SDRAM II               |       26 | 2014-09-04 |       12 | 2014-09-12 |
| Flash RAM 8Gb          |        8 | 2014-09-04 |        7 | 2014-09-12 |
| Flash RAM 4Gb          |       18 | 2014-09-04 |       30 | 2014-09-12 |
+------------------------+----------+------------+----------+------------+

Выделение различий между таблицами цветом.

Чтобы закрасить ячейки с разными значениями на двух листах выбранным вами цветом, используйте функцию условного форматирования Excel:

  • На листе, где вы хотите выделить различия, выберите все используемые ячейки. Для этого щелкните верхнюю левую ячейку используемого диапазона, обычно A1, и нажмите , чтобы расширить выделение до последней использованной ячейки.
  • На вкладке Главная кликните Условное форматирование > Новое правило и создайте его со следующей формулой:

Где Лист2 — это имя другого листа, который вы сравниваете с текущим.

В результате ячейки с разными значениями будут выделены выбранным вами цветом:

Если вы не очень хорошо знакомы с условным форматированием, вы можете найти подробные инструкции по созданию правила в следующем руководстве: Условное форматирование Excel в зависимости от значения ячейки.

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

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

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

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

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

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

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

Вывод данных из таблицы MySQL с помощью PHP (PDO)

Иногда вывод большого количества данных в терминале может быть неудобен или даже не читаем, в таком случае будет лучше вывести данные таблицы на веб-странице с помощью PHP, используя модуль PDO.

Создадим файл c HTML-таблицей, ячейки которой будут заполнятся данными из таблицы books.

<!DOCTYPE html>
<html>
<head>
<meta charset=»utf-8″>
<title>SELECT</title>
<style>
td:nth-child(5),td:nth-child(6){text-align:center;}
table{border-spacing: 0;border-collapse: collapse;}
td, th{padding: 10px;border: 1px solid black;}
</style>
</head>
<body>
<?php
$db_server = «localhost»;
$db_user = «root»;
$db_password = «MySafePass4!»;
$db_name = «Bookstore»;

try {
// Открываем соединение, указываем адрес сервера, имя бд, имя пользователя и пароль,
// также сообщаем серверу в какой кодировке должны вводится данные в таблицу бд.
$db = new PDO(«mysql:host=$db_server;dbname=$db_name», $db_user, $db_password,array(PDO::MYSQL_ATTR_INIT_COMMAND=>»SET NAMES utf8″));
// Устанавливаем атрибут сообщений об ошибках (выбрасывать исключения)
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// Запрос на вывод записей из таблицы
$sql = «SELECT id, title, author, price, discount, amount FROM books»;
// Подготовка запроса
$statement = $db->prepare($sql);
// Выполняем запрос
$statement->execute();
// Получаем массив строк
$result_array = $statement->fetchAll();

echo «<table><tr><th>ID</th><th>Title</th><th>Author</th><th>Price</th><th>Discount</th><th>Amount</th></tr>»;
foreach ($result_array as $result_row) {
echo «<tr>»;
echo «<td>» . $result_row . «</td>»;
echo «<td>» . $result_row . «</td>»;
echo «<td>» . $result_row . «</td>»;
echo «<td>» . $result_row . «</td>»;
echo «<td>» . $result_row . «</td>»;
echo «<td>» . $result_row . «</td>»;
echo «</tr>»;
}
echo «</table>»;
}

catch(PDOException $e) {
echo «Ошибка при создании записи в базе данных: » . $e->getMessage();
}

// Закрываем соединение
$db = null;
?>
</body>
</html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

<!DOCTYPE html>

<html>

<head>

<meta charset=»UTF-8″>

<title>SELECT<title>

<style>

td:nth-child(5),td:nth-child(6){text-aligncenter;}

table{border-spacing;border-collapsecollapse;}

td, th{padding10px;border1pxsolidblack;}

</style>

<head>

<body>

<?php

$db_server=»localhost»;

$db_user=»root»;

$db_password=»MySafePass4!»;

$db_name=»Bookstore»;

try{

// Открываем соединение, указываем адрес сервера, имя бд, имя пользователя и пароль,

// также сообщаем серверу в какой кодировке должны вводится данные в таблицу бд.

$db=newPDO(«mysql:host=$db_server;dbname=$db_name»,$db_user,$db_password,array(PDO::MYSQL_ATTR_INIT_COMMAND=>»SET NAMES utf8″));

// Устанавливаем атрибут сообщений об ошибках (выбрасывать исключения)

$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

// Запрос на вывод записей из таблицы

$sql=»SELECT id, title, author, price, discount, amount FROM books»;

// Подготовка запроса

$statement=$db->prepare($sql);

// Выполняем запрос

$statement->execute();

// Получаем массив строк

$result_array=$statement->fetchAll();

echo»<table><tr><th>ID</th><th>Title</th><th>Author</th><th>Price</th><th>Discount</th><th>Amount</th></tr>»;

foreach($result_arrayas$result_row){

echo»<tr>»;

echo»<td>».$result_row»id».»</td>»;

echo»<td>».$result_row»title».»</td>»;

echo»<td>».$result_row»author».»</td>»;

echo»<td>».$result_row»price».»</td>»;

echo»<td>».$result_row»discount».»</td>»;

echo»<td>».$result_row»amount».»</td>»;

echo»</tr>»;

}

echo»</table>»;

}
 

catch(PDOException$e){

echo»Ошибка при создании записи в базе данных: «.$e->getMessage();

}

// Закрываем соединение

$db=null;

?>

<body>

<html>

Результат заполнения HTML-таблицы данными из таблицы books.

Результат вывода данных из таблицы MySQL при помощи PHP

Вывод статистики с накоплением по дате

Предположим, что у нас имеется склад с некими товарами. Товары периодически поступают, и нам бы хотелось видеть в отчете остатки товаров по дням. Поскольку данные о наличии товаров необходимо накапливать, то мы введем пользовательскую переменную. Но есть одно небольшое “но”. Мы не можем использовать в запросе переменные пользователя и группировку данных одновременно (вернее можем, но в итоге получим, не то, что ожидаем), но мы можем использовать вложенный запрос, вместо явно указанной таблицы. Данные в таблице будут предварительно сгруппированы по дате. И уже затем на основе этих данных мы произведем расчет статистики с накоплением.

На первом этапе требуется установить переменную и присвоить ей нулевое значение:

SET @cvalue = 0

В следующем запросе, мы созданную ранее переменную и применим:

SELECT products.Name AS Name, (@cvalue := @cvalue + Orders) as Orders, 
Date FROM (SELECT ProductID AS ProductID, SUM(Orders) AS Orders, 
DATE(date) AS Date FROM statistics WHERE ProductID = '1' GROUP BY date) 
AS statistics JOIN products ON statistics.ProductID = products.id

Итоговый отчет:

+-----------------------+--------+------------+
| Name                  | Orders | Date       |
+-----------------------+--------+------------+
| Процессоры Pentium II |      1 | 2014-09-04 |
| Процессоры Pentium II |      2 | 2014-09-12 |
| Процессоры Pentium II |      4 | 2014-09-14 |
| Процессоры Pentium II |      6 | 2014-09-15 |
+-----------------------+--------+------------+

Получить используемую в примерах базу данных можно здесь.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: