Поиск одновременно в двух таблицах

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
logonarium
Сообщения: 13
Зарегистрирован: 2011.07.19, 09:40

Поиск одновременно в двух таблицах

Сообщение logonarium »

Скорее всего, туплю, но все же...

Ситуёвина: есть две таблицы и две модели соответственно, скажем: A и B. В таблицах одинаковые наборы полей (условно): id, partnumber, price. Возможно ли одним запросом осуществить поиск в обеих таблицах, скажем по полю partnumber?

Объясню, почему данные в двух таблицах: хоть набор полей и одинаков, но данные хранящиеся в таблицах, относятся все-таки к несколько разным видам (хоть и одной сущности). Ну например, в таблице А хранятся "оригиналы", в таблице В - "замены для оригиналов".
Ну и кол-во записей в каждой порядка 1 000 000 - 3 000 000.

Гугл ничего не подсказал, к сожалению
mrix
Сообщения: 125
Зарегистрирован: 2010.08.30, 11:48
Откуда: Россия, Новосибирск

Re: Поиск одновременно в двух таблицах

Сообщение mrix »

А почему бы не использовать UNION?
logonarium
Сообщения: 13
Зарегистрирован: 2011.07.19, 09:40

Re: Поиск одновременно в двух таблицах

Сообщение logonarium »

Ну вот это и пришло в голову сразу же. Но реализовано ли это в AR Yii!? Что-то в документации явно я не увидел про это.
logonarium
Сообщения: 13
Зарегистрирован: 2011.07.19, 09:40

Re: Поиск одновременно в двух таблицах

Сообщение logonarium »

Тут как бы получается паттерн наследование с одной таблицей, но наоборот - наследование от двух таблиц, что ли... А вот как бы его спроектировать - пока оригинальных мыслей нет
Единственное, что нашел это вот, но правки кода самого Yii не устраивают
Последний раз редактировалось logonarium 2011.07.28, 18:12, всего редактировалось 2 раза.
mrix
Сообщения: 125
Зарегистрирован: 2010.08.30, 11:48
Откуда: Россия, Новосибирск

Re: Поиск одновременно в двух таблицах

Сообщение mrix »

Можно попробовать так:
1. Описать два класса с разными таблицами
2. Переопределить метод instantiate()
3. Искать через findAllBySql()
logonarium
Сообщения: 13
Зарегистрирован: 2011.07.19, 09:40

Re: Поиск одновременно в двух таблицах

Сообщение logonarium »

Ну и как бы вытекающее из всего размышление: а стоит ли заморачиваться с UNION!? Может, лучше все-таки через два разных SELECT'а черех A::model()->findAll() и В::model()->findAll()!? Тем более что искомое значение ищется через LIKE 'значение%' и характер хранящихся данных не позволяет создать по этом полю INDEX UNIQUE
mrix
Сообщения: 125
Зарегистрирован: 2010.08.30, 11:48
Откуда: Россия, Новосибирск

Re: Поиск одновременно в двух таблицах

Сообщение mrix »

Вопрос был "Поиск одновременно в двух таблицах" :)

Конечно 2мя запросами. Разницы не увидите.
mrix
Сообщения: 125
Зарегистрирован: 2010.08.30, 11:48
Откуда: Россия, Новосибирск

Re: Поиск одновременно в двух таблицах

Сообщение mrix »

Просто через UNION вы можете сортировать, группировать и т.д. данные из 2х таблиц
logonarium
Сообщения: 13
Зарегистрирован: 2011.07.19, 09:40

Re: Поиск одновременно в двух таблицах

Сообщение logonarium »

Принцип понятен.
Последний, уж совсем ламерский вопрос :) - что (или каким образом) переопределить в методе instantiate() ?
mrix
Сообщения: 125
Зарегистрирован: 2010.08.30, 11:48
Откуда: Россия, Новосибирск

Re: Поиск одновременно в двух таблицах

Сообщение mrix »

Тут нужно, чтобы был какой-то атрибут в выборке различный.

Добавить поля

Код: Выделить всё

`type` CHAR(1) DEFAULT 'x'
`type` CHAR(1) DEFAULT 'y'
в разные таблицы.

Или делать запрос типа:

Код: Выделить всё

(SELECT *, 'x' AS `type` FROM table1) UNION ALL (SELECT *, 'y' AS `type` FROM table2)
Код instantiate:

Код: Выделить всё

public function instantiate($attributes)
    {
        //тип
        $type = isset($attributes['type']) ? $attributes['type'] : 'unknown';
        
        //первая таблица
        if ($type === 'x')
        {
            return new Item1(null);
        }
        //вторая таблица
        elseif ($type === 'y')
        {
            return new Item2(null);
        }
        //неизвестный тип
        else
        {
            return parent::instantiate($attributes);
        }
    } 
TM123
Сообщения: 608
Зарегистрирован: 2011.06.09, 11:18

Re: Поиск одновременно в двух таблицах

Сообщение TM123 »

1. А чем вам не нравится код приведенный вами же по ссылке, очень правильное решение, порождаем потомка от базового класса фреймворка и делаем его поведение нужным нам - это в общем то основная парадигма ООП, я так постоянно поступаю если базовый класс не дает нужного функционала, при этом он совершенно нативно живет и обрабатывается во всех частях фреймворка.
2. Вот еще одна хотелка в YII 2.0 :)
Ответить