У меня есть требование для функции PHP, которая берет таблицу или таблицы и необходимые столбцы из этих таблиц БД и возвращает HTML-таблицу, содержащую данные. Я знаю, как сделать это для одного стола, но я борюсь с тем, как сделать это более динамичным
Я думаю, что для одной таблицы будет иметь функцию, которая берет имя таблицы, а затем массив столбцов, а затем просто выбирает данные из таблицы, а затем перебирает их, создавая данные в виде HTML, а затем возвращает их из функции.
В качестве примера моя база данных имеет две таблицы; пользователи и заказы
users
|----------------------------|
|user_id|first_name|last_name|
|-------|----------|---------|
orders
|----------------------|
|order_id|user_id|total|
|--------|-------|-----|
Теперь с помощью функции, описанной выше, было бы легко сгенерировать таблицу для всех пользователей или заказов, но я хотел бы иметь функцию, с помощью которой я мог бы динамически объединять таблицы и например перечислите всех пользователей и количество заказов, которые они сделали или перечислите все заказы от пользователя x. Я знаю, что это было бы возможно со многими различными функциями, но я действительно заинтересован в разработке способа сделать это динамически и в основном строить все отношения как-то в программе, а затем иметь возможность вызывать одну функцию и запрашивать столбцы x, y и z
Мое мышление до сих пор будет (снова для этого примера) как-то определить, что number of orders for user i = count(order_id) where user_id = i
Надеюсь, что это имеет смысл, и спасибо заранее
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
таблица может использоваться для поиска всех связей внешнего ключа от конкретной таблицы к другим таблицам, например:
SELECT `TABLE_NAME`,
`COLUMN_NAME`,
`REFERENCED_TABLE_NAME`,
`REFERENCED_COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE`
WHERE `TABLE_SCHEMA` = SCHEMA() -- current schema
AND `REFERENCED_TABLE_NAME` IS NOT NULL
AND `TABLE_NAME` = 'orders'; -- name of table to get relationships to other tables
Это должно вернуть что-то вроде следующего:
+--------------+-------------+-----------------------+------------------------+
| TABLE_NAME | COLUMN_NAME | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME |
+--------------+-------------+-----------------------+------------------------+
| orders | user_id | users | user_id |
+--------------+-------------+-----------------------+------------------------+
Выше может быть сделано в PHP, а затем результаты могут быть перебраны, чтобы динамически построить запрос, который выбирает из этих таблиц, объединяясь в перечисленных столбцах. Оставлю эту часть в качестве упражнения 😉
Вам не нужно было бы создавать функцию для сбора данных из первой таблицы, а затем их обтекания и получения данных из второй таблицы.
SQL может сделать это для вас одним попаданием в базу данных.
Все, что вам нужно сделать, это соединить две таблицы и получить нужные данные.
Если я правильно понял, что вам нужно, вы хотите получить идентификатор всех пользователей из первой таблицы и получить счет их заказов из второй таблицы.
Это может сделать простое соединение или выбор из обеих таблиц, и я предлагаю что-то вроде:
Select a.user_id, b.count(order_id)
FROM table1 as a, table2 as b
WHERE a.user_id = b.user_id
Group By a.user_id
Или вы можете присоединиться к столам и выполнить аналогичную задачу.
Я предполагаю, что вы получите доступ к базе данных из PHP-кода, так что попробуйте и отправьте мне свой отзыв.
Это легко реализовать, но мы должны исправить несколько вещей.
Наше требование:
1. Определите таблицы в соответствии с именем столбца.
2. Как мы можем присоединиться к этим столам.
3. Как устранить неоднозначность столбцов.
Решение:
Уникальное имя столбца для каждого поля или нет таблицы с повторяющимся именем столбца.
Для этого у нас должен быть фиксированный префикс таблицы для каждой таблицы.
например:
Ваше имя столбца может быть odr_orderid и usr_orderid.
Теперь, идентифицируя уникальные префиксы, мы можем идентифицировать таблицы.
Теперь возникает вопрос, как объединить эти таблицы
Чтобы решить это:
Создайте еще одну таблицу с сильными клавишами JOIN и типом JOin Left, right, inner или full.
Вот и все Теперь вы можете сделать запрос, как хотите.