Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как сгрупировать данные 2х таблиц, когда из одной нужна одна строка, а из другой все / 9 сообщений из 9, страница 1 из 1
02.10.2017, 21:50
    #39529702
Валодя
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгрупировать данные 2х таблиц, когда из одной нужна одна строка, а из другой все
Доброй ночи
есть запрос

Код: plsql
1.
2.
3.
4.
5.
6.
SELECT SQL_CALC_FOUND_ROWS * FROM (SELECT *,
(SELECT users_meta.meta_value FROM users_meta WHERE users_meta.meta_name = 'country' AND users.id = 22 ORDER BY users_meta.id DESC LIMIT 1) AS country,
(SELECT users_meta.meta_value FROM users_meta WHERE users_meta.meta_name = 'address' AND users.id = 22 ORDER BY users_meta.id DESC LIMIT 1) AS address,
(SELECT users_meta.meta_value FROM users_meta WHERE users_meta.meta_name = 'mail_verifikation' AND users.id = 22 ORDER BY users_meta.id DESC LIMIT 1) AS mail_verifikation,
(SELECT users_meta.meta_value FROM users_meta WHERE users_meta.meta_name = 'sms_verifikation' AND users.id = 22 ORDER BY users_meta.id DESC LIMIT 1) AS sms_verifikation                                    
FROM users WHERE id = 22) data



как его можно переделать так чтоб не нужно было указывать каждое мета поле по имени примерно вот так

Код: sql
1.
2.
3.
SELECT SQL_CALC_FOUND_ROWS * FROM (SELECT *,
(SELECT users_meta.meta_value FROM users_meta ORDER BY users_meta.id DESC LIMIT 1) AS users_meta.meta_name                                    
FROM users WHERE id = 22) data



или есть другой способ получить в одну выборку данные самого юзера и мета полей (хочется большего - получать и users_relationships из которого моно получить родителя и департамент, но до этого далеко)
...
Рейтинг: 0 / 0
02.10.2017, 23:32
    #39529738
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгрупировать данные 2х таблиц, когда из одной нужна одна строка, а из другой все
Валодяесть запрос
Бредовый запрос. Выборка из users_meta никак не зависит от требуемого users.id.
...
Рейтинг: 0 / 0
03.10.2017, 00:09
    #39529746
Валодя
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгрупировать данные 2х таблиц, когда из одной нужна одна строка, а из другой все
плохо описал
есть юзеры с id и есть меты с user_id (object_id), меты выбираем по user.id = meta.object_id
проблема в том что меты могут дублироваться по meta.meta_name и нужно получить последнюю сортируя по meta.id DESC и беря только последнюю и нужно взять все уникальные - тоесть могут быть записи а могут и не быть meta.meta_name :

страна
последний ip
город
последний ip
город
последний ip

их разное количестко и разное количество дублей

можно так

Код: sql
1.
SELECT id,name,email,pass FROM users WHERE id='$id'


+
Код: sql
1.
SELECT * FROM (SELECT * FROM users_meta WHERE object_id='$id' ORDER BY id DESC) AS data GROUP BY meta_name



но полученные данные нужно обрабатывать и складывать в массив вручную - хочется сразу получить 1 массив вида

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
array(
	id=>$id,
	name=>$name,
	email=>$email,
	страна=>$country,
	город=>$city,
	последний ip=>$ip
)
...
Рейтинг: 0 / 0
03.10.2017, 00:13
    #39529748
Валодя
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгрупировать данные 2х таблиц, когда из одной нужна одна строка, а из другой все
Akina,
извиняюсь - запрос в вопросе был такой

Код: sql
1.
2.
3.
4.
5.
6.
SELECT SQL_CALC_FOUND_ROWS * FROM (SELECT *,
(SELECT users_meta.meta_value FROM users_meta WHERE users_meta.meta_name = 'country' AND object_id = 22 ORDER BY users_meta.id DESC LIMIT 1) AS country,
(SELECT users_meta.meta_value FROM users_meta WHERE users_meta.meta_name = 'address' AND object_id = 22 ORDER BY users_meta.id DESC LIMIT 1) AS address,
(SELECT users_meta.meta_value FROM users_meta WHERE users_meta.meta_name = 'mail_verifikation' AND object_id = 22 ORDER BY users_meta.id DESC LIMIT 1) AS mail_verifikation,
(SELECT users_meta.meta_value FROM users_meta WHERE users_meta.meta_name = 'sms_verifikation' AND object_id = 22 ORDER BY users_meta.id DESC LIMIT 1) AS sms_verifikation                                    
FROM users WHERE id = 22) data
...
Рейтинг: 0 / 0
03.10.2017, 07:44
    #39529783
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгрупировать данные 2х таблиц, когда из одной нужна одна строка, а из другой все
Стандартный подход - JOIN нескольких копий таблицы с метаданными:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT u.*
     , um1.meta_value country
     , um2.meta_value address
     , um3.meta_value mail_verifikation
     , um4.meta_value sms_verifikation
FROM users u
/* LEFT */ JOIN users_meta um1 ON u.id = um1.object_id AND um1.meta_name = 'country'
/* LEFT */ JOIN users_meta um2 ON u.id = um2.object_id AND um2.meta_name = 'address'
/* LEFT */ JOIN users_meta um3 ON u.id = um3.object_id AND um3.meta_name = 'mail_verifikation'
/* LEFT */ JOIN users_meta um4 ON u.id = um4.object_id AND um4.meta_name = 'sms_verifikation'
WHERE u.id = 22
/* ORDER BY um1.id, um2.id, um3.id, um4.id LIMIT 1 */



Для метаданных, наличие которых гарантируется, используется обычный (INNER) JOIN, для метаданных, которых в таблице может не быть - LEFT JOIN. Сортировка и лимитирование - по вкусу. Опять же только для метаданных, которые могут дублироваться (что в общем странно). Сами необязательные метаданные можно обернуть в COALESCE, чтобы для отсутствующих вместо NULL получать вменяемую текстовку.
...
Рейтинг: 0 / 0
03.10.2017, 10:44
    #39529943
Валодя
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгрупировать данные 2х таблиц, когда из одной нужна одна строка, а из другой все
Akina,

в том то и дело что мы не знаем есть там данные или нет, поэтому неможем перечислить их тк позже могут появиться новые и нужно каждый раз в запрос будет добавлять новое mena_name

дублирование например ведётся для записи 3х последних ip

в мета я пишу кто создал и когда
...
Рейтинг: 0 / 0
03.10.2017, 11:04
    #39529966
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгрупировать данные 2х таблиц, когда из одной нужна одна строка, а из другой все
Валодямы не знаем есть там данные или нет, поэтому неможем перечислить их тк позже могут появиться новые и нужно каждый раз в запрос будет добавлять новое mena_nameТогда динамический SQL.

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

В любом случае такой подход лучше, чем пачка коррелированных подзапросов. Тебя спасает только то, что в твоём запросе получаются данные исключительно по одному users.id.
...
Рейтинг: 0 / 0
03.10.2017, 11:27
    #39530003
Валодя
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгрупировать данные 2х таблиц, когда из одной нужна одна строка, а из другой все
Akina, а варианты с while никак не подходят?

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT SQL_CALC_FOUND_ROWS * FROM (SELECT *,

while(SELECT * FROM (SELECT * FROM users_meta WHERE object_id='$id' ORDER BY id DESC) AS arr GROUP BY meta_name){ // тут не знаю как получить и пройти по строкам

(SELECT users_meta.meta_value FROM users_meta where id = arr.id) AS arr.meta_name  
 }        
FROM users WHERE id = 22) data



синтаксис вписал от php и показал логику запроса
...
Рейтинг: 0 / 0
03.10.2017, 14:17
    #39530167
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгрупировать данные 2х таблиц, когда из одной нужна одна строка, а из другой все
Это и будет динамический SQL на стороне сервера. Читать мануал по PREPARE + EXECUTE + DEALLOCATE, ну и само собой по CREATE PROCEDURE.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как сгрупировать данные 2х таблиц, когда из одной нужна одна строка, а из другой все / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]