Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Закрытая темаСоздание новой темыСоздание опроса

> Выборка из 3х и более таблиц, чёт не прёт меня сложные запросы мастерить
Игорь_Vasinsky  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Журнал
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 26774
Пользователь №: 21350
На форуме: 15 лет, 5 дней
Карма: 756




Вообщем есть 3 таблицы с данными - у каждой есть столбец `prid` - по нему соб-но и выборка.

Главная `product` - из остальных 2х нужно всё запихать по `prid`

(SELECT * FROM `product` LEFT JOIN `product_namefeat_value` USING(prid)) 
UNION
(SELECT * FROM `product` LEFT JOIN `images` USING(prid))


с ON `product`.`prid` = `...`.`prid` - тоже не проканывает.



Спустя 1 час, 35 минут, 22 секунды (7.08.2012 - 09:26) johniek_comp написал(а):
хз мож так попробуй
SELECT p.*,t2.*,t3.* FROM product AS p,t2,t3
LEFT JOIN t2 ON t2.prid = p.prid
LEFT JOIN t3 ON t3.prid = p.prid

Спустя 2 минуты, 45 секунд (7.08.2012 - 09:29) Игорь_Vasinsky написал(а):
а разница? что с альясами, что без них, толи во втором JOIN WHERE юзать...

Спустя 1 минута, 54 секунды (7.08.2012 - 09:31) johniek_comp написал(а):
Игорь_Vasinsky
опиши подробно, напишу запрос, я наверно не понял чуток

Спустя 7 минут, 6 секунд (7.08.2012 - 09:38) Игорь_Vasinsky написал(а):
смотри

есть 3 таблицы - в каждой есть столбец `prid`

t1 - из этой таблицы берутся данные и дополняются из таблиц t2 и t3 - связь - столбец `prid`

специально prid делал везде, думал чтоб обойтись без ON - чисто с USING

Спустя 11 минут, 54 секунды (7.08.2012 - 09:50) Placido написал(а):
Не понял, а чем обычный JOIN не подходит?
SELECT `p`.*, `pn`.*, `i`.* FROM `product` `p` 
LEFT JOIN `product_namefeat_value` `pn` ON `p`.`prid` = `pn`.`prid`
LEFT JOIN `images` `i` ON `p`.`prid` = `i`.`prid`;

Спустя 5 минут, 5 секунд (7.08.2012 - 09:55) Игорь_Vasinsky написал(а):
Я не видел раньше такого синтаксиса
Цитата
`product_namefeat_value` `pn`

2 таблицы подряд без всяких операторов. таблицы-алияс

щас проверю.

Спустя 56 минут, 44 секунды (7.08.2012 - 10:51) Игорь_Vasinsky написал(а):
выборки нет из 3й таблицы.
гоню. это я криворукий. спс.+

Спустя 2 дня, 1 час, 28 минут, 13 секунд (9.08.2012 - 12:20) Игорь_Vasinsky написал(а):
Обнаружил баг

если какая нить таблица не содержит значений в поле `prid` - пре выборке `prid` == null

в моём случае именно таблица `images` - не содержит вообще записей

в итоге

Array
(
[prid] =>
[name] => Купон на билет
[namefeat] => Номер
[feat] => number
[featval] => eb80753e24ff80e69928
[image] =>
)


из за чего так?

Спустя 52 минуты, 46 секунд (9.08.2012 - 13:12) inpost написал(а):
если я правильно понял, ты не выбирай через * всё, не делай * ко всем таблицам. Можешь так сделать:
main.*, second.`image`,third.`feat` , в таком роде.

Спустя 5 минут, 12 секунд (9.08.2012 - 13:18) Игорь_Vasinsky написал(а):
мне нужны все столбцы во всех таблицах попробывал явно указать имента столбцов - без результата

Спустя 19 минут, 14 секунд (9.08.2012 - 13:37) Invis1ble написал(а):
выложи тестовый дамп и еще раз сформулируй задачу, потому что я например так и не понял толком, что ты хочешь сделать

Спустя 7 минут, 46 секунд (9.08.2012 - 13:45) Игорь_Vasinsky написал(а):
есть 3 таблицы

`product`
`product_namefeat_value`
`images`

cвязь у этих таблиц по столбцу `prid` (product id)

мне нужно сделать выборку по `prid`



CREATE TABLE IF NOT EXISTS `images` (
`prid` int(11) DEFAULT NULL,
`image` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE IF NOT EXISTS `product` (
`prid` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(80) NOT NULL,
PRIMARY KEY (`prid`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=142 ;

INSERT INTO `product` (`prid`, `name`) VALUES
(141, 'Товар');


CREATE TABLE IF NOT EXISTS `product_namefeat_value` (
`prid` int(11) DEFAULT NULL,
`namefeat` varchar(300) DEFAULT NULL,
`feat` varchar(300) DEFAULT NULL,
`featval` varchar(300) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



INSERT INTO `product_namefeat_value` (`prid`, `namefeat`, `feat`, `featval`) VALUES
(141, 'Номер', 'number', 'eb80753e24ff80e69928'),
(
141, 'Наименование', 'name', 'Купон на билет'),
(
141, 'Псевдоним', 'pseudonim', 'kupon_na_bilet'),
(
141, 'Количество', 'count', '1'),
(
141, 'Категория', 'catid', '21'),
(
141, 'Описание', 'description', 'фыв');

Спустя 17 минут, 8 секунд (9.08.2012 - 14:02) Invis1ble написал(а):
select p.*, i.image, pnv.namefeat, pnv.feat, pnv.featval
from product p
left join images i on i.prid = p.prid
left join product_namefeat_value pnv on pnv.prid = p.prid

если одна из таблиц пуста - конечно ты получишь null в качестве значений соответствующих полей

Спустя 2 минуты, 32 секунды (9.08.2012 - 14:04) Игорь_Vasinsky написал(а):
гениально.
просто не указывать в SELECT ту ячеку, которая может оказаться null - правильно понял?

Спустя 12 минут, 44 секунды (9.08.2012 - 14:17) Invis1ble написал(а):
Цитата
просто не указывать в SELECT ту ячеку, которая может оказаться null - правильно понял?

в принципе да, но я не это хотел донести
а почему ты вообще так боишься null ? )

Спустя 5 минут, 57 секунд (9.08.2012 - 14:23) Игорь_Vasinsky написал(а):
ну получается что при выборке prid=null, а я его использую для указания индекса элемента массива.

Спустя 11 минут, 22 секунды (9.08.2012 - 14:34) Invis1ble написал(а):
ну в итоге решена проблема, получается?

Спустя 41 секунда (9.08.2012 - 14:35) Игорь_Vasinsky написал(а):
да, спс. плюсанул)

Спустя 16 секунд (9.08.2012 - 14:35) inpost написал(а):
Игорь_Vasinsky
SELECT t1.*,t2.*,t3.*,t1.`prid` AS `special_prid`

Спустя 2 минуты, 3 секунды (9.08.2012 - 14:37) Игорь_Vasinsky написал(а):
и что это даст? rolleyes.gif там будет сидеть значение из одной из таблиц которое не null?

Спустя 1 минута, 43 секунды (9.08.2012 - 14:39) inpost написал(а):
Игорь_Vasinsky
а то, что из первой таблицы у тебя будет в special_prid - нужный тебе prid, с ним и работай, а на prid обычный забить можешь.

Спустя 4 минуты, 22 секунды (9.08.2012 - 14:43) Игорь_Vasinsky написал(а):
а... у меня просто уже 20 мин пере глазами всё плывёт)

показалось что так

Цитата
SELECT t1.*,t2.*,t3.*  AS `special_prid`


не заметил t1.`prid` biggrin.gif


--------------------
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Закрытая темаСоздание новой темыСоздание опроса