SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 23.01.2017 23:17:27

buldog52
Участник
Зарегистрирован: 11.12.2016
Сообщений: 9

Как установить связи между таблицами по определенному полю?

Всем привет.

Есть запрос (рабочий)

SELECT
PCP.`id_product` , PPL.`name` ,
GROUP_CONCAT(DISTINCT iF(PPA.`id_product_attribute`,PAL.`name`,null) ORDER BY PPA.`id_product_attribute` ASC) AS 'размеры',
PFP.`id_feature_value` as feat8

FROM  `ps_category_product` AS PCP 
LEFT JOIN `ps_product_lang` AS PPL ON (PCP.`id_product` = PPL.`id_product`)
LEFT JOIN `ps_feature_product` AS PFP ON (PCP.`id_product` = PFP.`id_product`)
LEFT JOIN `ps_feature_value_lang` AS PFVL ON (PFP.`id_feature_value` = PFVL.`id_feature_value`)

LEFT JOIN `ps_product_attribute` AS PPA ON (PCP.`id_product` = PPA.`id_product`)
LEFT JOIN `ps_product_attribute_combination` AS PPAC ON (PPAC.`id_product_attribute` = PPA.`id_product_attribute`)
LEFT JOIN `ps_attribute_lang` AS PAL ON (PAL.`id_attribute` = PPAC.`id_attribute`)

WHERE PCP.`id_category` = 399
           
GROUP BY PCP.`id_product`
HAVING feat8 = 34

Суть этого запроса, вывести определенные товары, пускай кольца на палец и их размеры (16, 17 ...).
Для того чтобы отобразить данные строкой
GROUP_CONCAT(DISTINCT iF(PPA.`id_product_attribute`,PAL.`name`,null) ORDER BY PPA.`id_product_attribute` ASC) AS 'размеры'

надо сджойнить 3 таблицы
LEFT JOIN `ps_product_attribute` AS PPA ON (PCP.`id_product` = PPA.`id_product`)
LEFT JOIN `ps_product_attribute_combination` AS PPAC ON (PPAC.`id_product_attribute` = PPA.`id_product_attribute`)
LEFT JOIN `ps_attribute_lang` AS PAL ON (PAL.`id_attribute` = PPAC.`id_attribute`)

Для этого ручками переклацал все таблицы и по их названиям нашел нужные мне поля.

Вопрос: нет ли какой команды, которая по имени поля в таблице, например: поле id_product в таблице ps_product_attribute выдаст всю цепочку взаимосвязанных таблиц и полей в них ?

Неактивен

 

#2 23.01.2017 23:24:16

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 411

Re: Как установить связи между таблицами по определенному полю?

Смотрите FOREIGN KEY

Неактивен

 

#3 24.01.2017 11:07:26

buldog52
Участник
Зарегистрирован: 11.12.2016
Сообщений: 9

Re: Как установить связи между таблицами по определенному полю?

а можно както предметнее намекнуть? пусть даже схематично, а то я в документации не разобрался. Спасибо

Неактивен

 

#4 24.01.2017 11:16:04

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Как установить связи между таблицами по определенному полю?

SELECT
  TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_SCHEMA = '<database>' AND
  REFERENCED_TABLE_NAME = '<table>';


SELECT
  TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_SCHEMA = '<database>' AND
  REFERENCED_COLUMN_NAME = '<column>';


http://stackoverflow.com/questions/2016 … -or-column


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 24.01.2017 11:19:11

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 411

Re: Как установить связи между таблицами по определенному полю?

Открыть таблицу там будут строки вида

CREATE TABLE tblname
....
CONSTRAINT FK_name_Id FOREIGN KEY (table1_id)  REFERENCES table1 (table1_Id) ON DELETE NO ACTION ON UPDATE CASCADE
Где будет указано поле (table1_id) существующей таблицы (tblname) которое ссылается на поле (table1_Id) другой таблицы (table1)
Или посмотреть зависимости в визуальном редакторе, например, dbForge for MySQL. Можно создать диаграмму и набросать в нее нужные таблицы. Связи автоматом отрисуются.
Или посмотреть связи в БД "information_schema". Думаю сами разберетесь. Как раз появиться опыт.

Но это только если разработчик использует FOREIGN KEY. Очень часто его не используют.

Отредактированно klow (24.01.2017 11:22:37)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson