Как правильно использовать WHERE с JOIN в SQL и PHP
Поэтому я пытаюсь реализовать JOIN на моем PHP, но я не знаю, как включить предложение WHERE в JOIN в моем запросе. Я пытаюсь сделать:
SELECT SpecialFacts.ConservationStatus, SpecialFacts.Reproduction, SpecialFacts.Length, Habitat.Type, Habitat.located FROM SpecialFacts INNER JOIN Habitat ON SpecialFacts.SpeciesID=Habitat.SpeciesID WHERE SpeciesID="G. cuvier"
В основном я пытаюсь убедиться, что соединение происходит в таблицах, где SpeciesID — G. cuvier, но все, что я пробовал до сих пор, не работает, и ошибка, которую он мне сейчас дает, — «Column SpeciesID, где предложение неоднозначно», Вот мой соответствующий PHP-код:
3 ответа
Column SpeciesID существует в обеих таблицах, поэтому он не знает, что нужно сравнивать со значением, заданным как G. cuvier . Когда вы пишете каждое имя столбца в виде имени таблицы с точкой (.), SpecialFacts.SpeciesID = «G. cuvier» же самое должно быть в столбце условия SpecialFacts.SpeciesID = «G. cuvier» . Таким образом, запрос должен выглядеть так:
SELECT SpecialFacts.ConservationStatus, SpecialFacts.Reproduction, SpecialFacts.Length, Habitat.Type, Habitat.located FROM SpecialFacts INNER JOIN Habitat ON SpecialFacts.SpeciesID=Habitat.SpeciesID WHERE SpecialFacts.SpeciesID="G. cuvier"
Это не дает вам эту ошибку, потому что вы неправильно используете WHERE . Это дает вам эту ошибку, потому что в вашем запросе есть несколько таблиц, у которых есть столбец с этим именем, а значит, и «неоднозначный». Вам просто нужно устранить его, добавив имя таблицы в идентификатор.
WHERE SpecialFacts.SpeciesID="G. cuvier"
WHERE Habitat.SpeciesID="G. cuvier"
Поскольку вы присоединяетесь к таблицам в этом столбце, каждая таблица должна работать для предложения WHERE. Я бы предложил использовать меньшую таблицу по соображениям производительности, но, честно говоря, я не уверен на 100%, если это будет иметь значение или нет. Вы можете сделать EXPLAIN на каждом из них, чтобы посмотреть, как они сравниваются.
SELECT SpecialFacts.ConservationStatus, SpecialFacts.Reproduction, SpecialFacts.Length, Habitat.Type, Habitat.located FROM SpecialFacts INNER JOIN Habitat ON SpecialFacts.SpeciesID=Habitat.SpeciesID WHERE SpecialFacts.SpeciesID='G. cuvier'
Ещё вопросы
- 0 Звонок из Angular в webAPI на другом домене превращается в ОПЦИИ
- 0 Предотвращение дублирования инициализации асинхронных служб в Angular.js
- 0 Математическая область Номер позиции Радиус распространения
- 0 конструкторы, вызывающие подкласс
- 0 Почему этот код печатает 0
- 1 Как я могу сохранить hourOfDay и минуты из timePickerDialog, чтобы сравнить его с какой-то другой переменной?
- 1 JavaScript перебирает 2D-массив и возвращает несоответствия
- 1 java-связывание со свободной функцией c: как правильно освободить объект
- 1 Правильный способ установки пользовательского плагина VueJs
- 0 нумерация страниц в формате mpdf с помощью шаблонного механизма smarty
- 1 Ошибка Android при загрузке неправильных цветов в ночном режиме
- 0 Передача / анализ большого количества данных формы в бэкэнд PHP
- 0 erreur: не удалось преобразовать ‘Cell *’ в ‘List *’ в назначении
- 0 Mysql запрос оптимизации или сократить запрос
- 1 Приоритеты в TestNG
- 1 Реструктуризация разбора результатов анализа многопоточного файла журнала
- 0 Как проверить поле ввода внутри ng-repeat
- 1 Scrapy — Получение 504 тайм-аута шлюза после первых запросов
- 1 удалить элементы из файла XML в Java
- 0 Я не могу сгенерировать автоинкрементный Id, а hibernate всегда генерирует 1 как Id
- 1 Как динамически добавлять свойства сущностей, используя N-Tier Entity Framework?
- 1 Итерация по файлу с чтением первых N значений
- 0 Как читать символы из txt файла в 2d массив C ++
- 0 PHP-скрипт для записи в базу данных SQL
- 1 WTForms: передача другого контейнера в валидатор
- 1 Как я могу показать два действия на одном экране?
- 0 Загружая контент в div с помощью jQuery.load (), как я могу заставить новые изображения исчезать при загрузке?
- 0 Google визуализация карта мира
- 0 C ++, используя операторы if-else для вычисления sin и cos
- 1 отображение списка возможностей программы
- 0 Как использовать угловые не против разделения кода?
- 0 как сделать пользовательскую директиву в угловых для расчета расстояния с помощью карт Google
- 1 Наследование Java — моделирование нескольких объектов
- 0 Слайдер изображений Nav Links Перейти к Anchor DIVs
- 1 Повторите тест на AssertionError
- 0 Как выбрать в MySQL данные | xx | xx | xx |
- 1 IndexOutOfBoundsException при добавлении элементов к определенному индексу с помощью обозревателя LiveData
- 1 Как сделать полосовой показ перед графиком
- 1 Круглый значок не отображается на Зефир
- 0 Отображение / скрытие div в зависимости от значения Select
- 0 Нам понадобится несколько советов: я хочу добавить и отобразить объекты в ArrayList с помощью jTable, а затем добавить эти записи в базу данных SQL
- 0 Невозможно создать запрошенный сервис [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] (при попытке использовать EntityManager)
- 1 Dagger 2 Android — зависимости inject () в ViewModels vs Application со ссылками на зависимости
- 0 сделать фоновое изображение div
- 0 Codeigniter Pagination не работает должным образом
- 0 Поверните строки таблицы в столбцы без результата
- 1 Как можно создать / удалить файлы в / data / data dir с помощью root в Android?
- 1 Модуль Android Studio Gradle чистой установки дает ошибку com.android.volley не существует
- 0 У вас нет прав доступа к / phpMyAdmin на этом сервере на сервере CentOS7 VPS
- 1 Бот Discord отправляет встроенное сообщение на другой канал
Write tidy Select and Join SQL Queries in PHP
Most of us have to interact with databases now and then in our projects, and SQL is by far the most common language used. However, working with SQL in PHP can be messy. If your queries are complex, you have to code them up as text strings which can be error prone, and suffer from formatting challenges. Also, when you want to build your SQL queries to have variables inside them, then you are forced to do substitution or pasting, which is a little bit tricky.
Today I will walk you through writing long and confusing Select and Join SQL Queries with ease in PHP. All you have to do is copy and paste this PHP file and save it in your project. The file contains a PHP class DbQuery with several methods/functions.
Download the source code of this project on Github.
The DbQuery class is a query builder which helps you create SQL queries. For instance:
$sql = new DbQuery(); $sql->select('*'); $sql->from('product', 'p'); $sql->where('p.product_id > 1'); $sql->where('p.category_id > 3'); $sql->orderBy('p.product_id'); $sql->limit(5, 10); echo $sql;
The above code will output the below query.
SELECT * FROM `product` p WHERE (p.product_id > 1) AND (p.category_id > 3) ORDER BY p.product_id LIMIT 10, 5
Main methods
__toString() – Generate and get the query.
build() – Generate and get the query (return a string).
from(string $table, mixed $alias = null) – Set table for FROM clause.
groupBy(string $fields) – Add a GROUP BY restriction.
having(string $restriction) – Add a restriction in the HAVING clause (each restriction will be separated by an AND statement).
innerJoin(string $table, string $alias = null, string $on = null) – Add a INNER JOIN clause
E.g. $this->innerJoin(‘product p ON . ‘) .
join(string $join) – Add a JOIN clause
E.g. $this->join(‘RIGHT JOIN’.DB_PREFIX.’product p ON . ‘); .
leftJoin(string $table, string $alias = null, string $on = null) – Add a LEFT JOIN clause.
leftOuterJoin(string $table, string $alias = null, string $on = null) – Add a LEFT OUTER JOIN clause.
limit(string $limit, mixed $offset = 0) – Limit results in query.
naturalJoin(string $table, string $alias = null) – Add a NATURAL JOIN clause.
orderBy(string $fields) – Add an ORDER BY restriction.
select(string $fields) – Add fields in query selection.
where(string $restriction) – Add a restriction in WHERE clause (each restriction will be separated by an AND statement).
Below are some samples on how to use the SQL Query builder. First we will start by connecting to our database. Please note that the DB_PREFIX constant must be included in your since it’s required in the DbQuery class.
require_once dirname(__FILE__) . '/db-query.php'; define( 'DB_HOST', 'localhost' ); define( 'DB_USER', 'root' ); define( 'DB_PASSWORD', 'password' ); define( 'DB_NAME', 'sql_builder' ); /** Must include this constant in your script since it's used by the DbQuery class */ define( 'DB_PREFIX', '' ); error_reporting(E_ALL); ini_set('display_errors', 1); // Create connection $conn = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); // Check connection if ($conn->connect_error) < die("Connection failed: " . $conn->connect_error); >
All the code below will be pasted after the above section. I will write sample codes and echo the SQL query below.
SELECT & ORDER BY
$sql = new DbQuery(); $sql->select('*'); $sql->from('product', 'p'); $sql->orderBy('p.product_id'); $result = $conn->query($sql); if ($result->num_rows > 0) < while($row = $result->fetch_assoc()) < print_r($row); >>
SELECT * FROM `product` p ORDER BY p.product_id
WHERE, OR & LIMIT
$sql = new DbQuery(); $sql->select('*'); $sql->from('product', 'p'); $sql->where('p.category_id = 3 OR p.category_id = 5'); $sql->orderBy('p.product_id'); $sql->limit(5, 10);
SELECT * FROM `product` p WHERE (p.category_id = 3 OR p.category_id = 5) ORDER BY p.product_id LIMIT 10, 5
COUNT, GROUP BY
$sql = new DbQuery(); $sql->select('COUNT(category_id) AS cat_sum, category_id'); $sql->from('product'); $sql->groupBy('category_id'); $result = $conn->query($sql); if ($result->num_rows > 0) < while($row = $result->fetch_assoc()) < print_r($row); >>
SELECT COUNT(category_id) AS cat_sum, category_id FROM `product` GROUP BY category_id
/** * Sql Joins * INNER JOIN: returns rows when there is a match in both tables. * LEFT JOIN: returns all rows from the left table, even if there are no matches in the right table. * RIGHT JOIN: returns all rows from the right table, even if there are no matches in the left table. **/ $sql = new DbQuery(); $sql->select('p.product_id, p.name AS product_name, c.name'); $sql->from('product', 'p'); $sql->innerJoin('category', 'c', 'p.category_id = c.category_id'); $result = $conn->query($sql); if ($result->num_rows > 0) < while($row = $result->fetch_assoc()) < print_r($row); >>
SELECT p.product_id, p.name AS product_name, c.name FROM `product` p INNER JOIN `category` `c` ON p.category_id = c.category_id
$sql = new DbQuery(); $sql->select('COUNT(p.product_id) AS prod_sum, p.category_id'); $sql->from('product', 'p'); $sql->having('COUNT(p.category_id) > 5'); $sql->groupBy('category_id'); $result = $conn->query($sql); if ($result->num_rows > 0) < while($row = $result->fetch_assoc()) < print_r($row); >>
SELECT COUNT(p.product_id) AS prod_sum, p.category_id FROM `product` p GROUP BY category_id HAVING (COUNT(p.category_id) > 5)
And that’s it guys for today. Thanks for reading! If you love articles like this, be sure to leave a comment and share it on social media. Happy Coding!
Download the source code of this project on Github.