SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 11.05.2017 20:58:03

kate_p
Участник
Зарегистрирован: 11.05.2017
Сообщений: 2

Выборка из 2х таблиц с чередованием строк

Добрый день,
Есть две таблицы photo и video с одинаковыми полями, нужно сделать выборку всех строк с чередованием.
Т.е например 3 строки первой таблицы photo, 1 строка из второй video и так далее до конца.
Помогите, не могу найти как это сделать.

Неактивен

 

#2 11.05.2017 21:04:46

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

Re: Выборка из 2х таблиц с чередованием строк

Удивительная постановка задачи, проще выбрать обе таблицы и на клиенте уже формировать тот порядок, который Вам нужен.

А что значит 3 строки? По каком критерию упорядочиваем?
А так вообще нужно union пользоваться для такого.

select * from photo ORDER BY `НУЖНОЕ ПОЛЕ` limit 3
union
select * from `video` ORDER BY `НУЖНОЕ ПОЛЕ` limit 1


select * from photo ORDER BY `НУЖНОЕ ПОЛЕ` limit 3 offset 3
union
select * from `video` ORDER BY `НУЖНОЕ ПОЛЕ` limit 1 offset 1


и так далее

Ну или создать view, которой будет union делать на обе таблицы и оттуда уже данные выдергивать.
А покажите пример данных в обеих таблицах? Может быть что-то получше придумается.


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

Неактивен

 

#3 19.05.2017 16:27:50

kate_p
Участник
Зарегистрирован: 11.05.2017
Сообщений: 2

Re: Выборка из 2х таблиц с чередованием строк

Я так и не нашла ответ на свой вопрос.
Попробую объяснить еще раз.

Есть 2 таблицы `фото` и `видео` с одинаковыми колонками `id`. `title` и т.д.
Я хочу выбрать все записи из обеих таблиц, но чтобы через каждые две строки из `фото` вставлялась одна из `видео`
не зависимо от количества строк в обеих таблицах
Должно получиться Фото.id1 Фото.id2 Фото.id3 Видео.Id1 Фото.id4 Фото.id5 Фото.id6 Видео.Id2

Неактивен

 

#4 19.05.2017 16:33:34

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

Re: Выборка из 2х таблиц с чередованием строк

В своем ответе я задал Вам несколько вопросов, они не были риторическими ;-).

Опять же, писал
А покажите пример данных в обеих таблицах? Может быть что-то получше придумается.
Не наблюдаю примера данных в Вашем ответе.


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

Неактивен

 

#5 19.05.2017 17:00:01

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Выборка из 2х таблиц с чередованием строк

deadka,
union зависит от кол-ва данных или писать заведомо большой запрос smile
имхо, переменные рулят:
фото нумеруем - 1,2,3,11,12,13,21,22,23,...
видео - 5,15,25,...

Неактивен

 

#6 19.05.2017 22:22:54

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

Re: Выборка из 2х таблиц с чередованием строк

vasya, нам ли не знать, что переменные - это шикарный способ выстрелить себе в ногу smile.
Union - совершенно согласен, но формально это ответ на вопрос ТС.

>Фото.id1 Фото.id2 Фото.id3 Видео.Id1 Фото.id4 Фото.id5 Фото.id6 Видео.Id2

Чтобы получить такой результат имхо нужно сделать две выборки - одну из таблицы с фото, другую из таблицы и спокойно на клиенте их отчередовать.

Так что дополнительный вопрос к ТС - зачем делать это одним запросом? Это вообще учебная задача в институте или рабочая (где не очень важно, как сделать, важен результат)?


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

Неактивен

 

#7 05.07.2017 19:47:00

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

Re: Выборка из 2х таблиц с чередованием строк

vasya написал:

deadka,
union зависит от кол-ва данных или писать заведомо большой запрос smile
имхо, переменные рулят:
фото нумеруем - 1,2,3,11,12,13,21,22,23,...
видео - 5,15,25,...

Здравствуйте, скажите, пожалуйста, как можно сравнить данные столбцов из двух разных таблиц при выборке, где в одной таблице столбец данные id записываются через запятую, а во второй таблице столбце записываются по строчкам.

Таблица 1
id производителя     id подкатегории производителя               ids_товара:
1                             1                                                            {"4":"586","5":"590","10":"582","11":"577","12":"578"}


Таблица 2
id производителя       цена товара             ids_товара:
1                               1                               4
1                               2                               586
1                               11                             5
1                               22                             590
1                               11                             10
1                               0                               582
1                               66                             11
1                               1                               577
1                               9                               12
1                               8                               578

Отредактированно buslikdrev (05.07.2017 20:39:40)

Неактивен

 

#8 05.07.2017 20:13:26

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

Re: Выборка из 2х таблиц с чередованием строк

Не стоит так делать - через запятую. Но если уж такова структура и менять нельзя - что значит "сравнить"? Формализуйте задачу.


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

Неактивен

 

#9 05.07.2017 20:34:36

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

Re: Выборка из 2х таблиц с чередованием строк

deadka написал:

Не стоит так делать - через запятую. Но если уж такова структура и менять нельзя - что значит "сравнить"? Формализуйте задачу.

Сообщение выше изменил столбец во второй таблице
В таблице 2, где через строчку, есть данные о цене, чтобы мне взять минимальную и максимальную цену товаров в подкатегории производителя 1, нужно сравнить id продукта. То есть во второй таблице нет столбца подкатегории производителя, там есть столбец цены. я просто думал есть способ сравнения, чтобы преобразовать один из столбцов во что-то и сравнить. Мне нужно модуле "Категории (производители)" вывести минимальную и максимальную цену, а тут такой косяк, id товара записывается через запятую, когда во всей БД на каждой строке.


На странице производителя минимальную и максимальную цену я вывел т.к. производитель есть в таблице товара №2
Но вывести цену на странице подкатегории производителя, а также на странице производителя в списке подкатегорий у меня не выходит т.к. не знаю, как при выборке сравнить эти id товара, которые записаны по разному.


    public function getDengi($manufacturer_id) {
    $query = $this->db->query("
        SELECT DISTINCT *, MIN(p.ценатовара) AS dengi1, MAX(p.ценатовара) AS dengi2
        FROM " . DB_PREFIX . "таблица2 p
        LEFT JOIN " . DB_PREFIX . "таблица1 p2c
        ON (p.idтовара = p2c.idsтовара)
        WHERE p2c.idподкатегории = '" . (int) $idподкатегории . "'");

        if ($query->num_rows) {
            return array(
                'dengi1'       => $query->row['dengi1'],
                'dengi2'       => $query->row['dengi2']
            );
        } else {
            return false;
        }
    }


Если одинаково записаны данные id товара, тогда всё хорошо, но они разные к сожалению.

Отредактированно buslikdrev (05.07.2017 20:52:13)

Неактивен

 

#10 05.07.2017 20:55:06

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Выборка из 2х таблиц с чередованием строк

select t2.* from t1 join t2 using(id_cat) where
find_in_set(t2.id_tov,replace(replace(replace(replace(t1.id_tov, '{', ''), '}', ''), ':', ','), '"', ''));
найдет id товара из второй таблицы, которые присутствуют в первой.

Но работать будет медленно. Добавьте во вторую таблицу id подкатегории производителя.

Неактивен

 

#11 05.07.2017 21:00:04

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

Re: Выборка из 2х таблиц с чередованием строк

vasya написал:

select t2.* from t1 join t2 using(id_cat) where
find_in_set(t2.id_tov,replace(replace(replace(replace(t1.id_tov, '{', ''), '}', ''), ':', ','), '"', ''));
найдет id товара из второй таблицы, которые присутствуют в первой.

Но работать будет медленно. Добавьте во вторую таблицу id подкатегории производителя.

Во вторую таблицу лучше не добавлять ничего - оригинальная таблица, вот в первую таблицу можно вертеть что-то, но если изменить в ней что-то это означает переписывать весь код модуля который не я создавал, а мне лишь дали задание вывести в подкатегориях минимальную и максимальную цену, которые создаёт этот модуль sad Я не знал, что с этим столкнусь, зато знания в копилку. Сейчас попробую ваш метод, спасибо, отпишусь.

Отредактированно buslikdrev (05.07.2017 21:02:50)

Неактивен

 

#12 06.07.2017 05:52:42

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

Re: Выборка из 2х таблиц с чередованием строк

vasya написал:

select t2.* from t1 join t2 using(id_cat) where
find_in_set(t2.id_tov,replace(replace(replace(replace(t1.id_tov, '{', ''), '}', ''), ':', ','), '"', ''));
найдет id товара из второй таблицы, которые присутствуют в первой.

Но работать будет медленно. Добавьте во вторую таблицу id подкатегории производителя.

Ваш вариант не катит, мне никак не создать вторую таблицу подкатегорий, откуда мне знать к какому товару пренадлежит та или иная подкатегория? Только с помощью id товара я могу присвоить подкатегорию, но id товара по разному записаны и просто так их не сравнить.

Что значит сравнить, например:
        SELECT DISTINCT *, MIN(p.price) AS dengi1, MAX(p.price) AS dengi2
        FROM " . DB_PREFIX . "product p
        LEFT JOIN " . DB_PREFIX . "manufacturer p2c
        ON (p.product_id = p2c.product_id)
        WHERE p2c.manufacturer_id = '" . (int)$manufacturer_id . "'

Данным запросом я вывожу максимальную и минимальную цену товара которые лежат в категории (manufacturer_id).
В общем к таблице product подключил ещё строки, а именно все столбцы из таблицы manufacturer

Вот в эту выборку нужно вставить ещё выборку которая в виртуальном mysql месте правильно бы сформировало по искусственным строкам product_id той ячейки, где через запятую внесены данные, чтобы я потом их сравнил.

В общем нужно ячейку преобразовать в столбец при это категории размножить на количество чисел в ячейке. Создам левую таблицу с новыми данными, потом буду сравнивать. Только нужно узнать, как преобразовать.
И ещё подскажите, пожалуйста, sql запросы последовательно идут, если я так запишу?
$query = $this->db->query('select...');
$query = $this->db->query('select...');
$query = $this->db->query('select...');

Отредактированно buslikdrev (06.07.2017 06:04:33)

Неактивен

 

#13 06.07.2017 11:30:43

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Выборка из 2х таблиц с чередованием строк

Что-то я запутался в ваших рассуждениях. Сравнить значение из столбца со строкой вы можете с помощью find_in_set. Чтобы найти максимальную и минимальную цену во всех подкатегориях, содержащих товары:


select t1.`id производителя`, t1.`id подкатегории производителя`, max(t2.`цена товара`), min(t2.`цена товара`)
from t1 join t2 using(id_cat) where
find_in_set(t2.id_tov,replace(replace(replace(replace(t1.id_tov, '{', ''), '}', ''), ':', ','), '"', ''))
group by t1.`id производителя`, t1.`id подкатегории производителя`;


если нужна конкретная подкатегория, то добавляйте условие в where
если есть подкатегории без товаров и их нужно отображать, то left join и обрабатывайте null

buslikdrev написал:

И ещё подскажите, пожалуйста, sql запросы последовательно идут, если я так запишу?

да

Неактивен

 

#14 06.07.2017 14:47:13

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

Re: Выборка из 2х таблиц с чередованием строк

vasya написал:

Что-то я запутался в ваших рассуждениях. Сравнить значение из столбца со строкой вы можете с помощью find_in_set. Чтобы найти максимальную и минимальную цену во всех подкатегориях, содержащих товары:


select t1.`id производителя`, t1.`id подкатегории производителя`, max(t2.`цена товара`), min(t2.`цена товара`)
from t1 join t2 using(id_cat) where
find_in_set(t2.id_tov,replace(replace(replace(replace(t1.id_tov, '{', ''), '}', ''), ':', ','), '"', ''))
group by t1.`id производителя`, t1.`id подкатегории производителя`;


если нужна конкретная подкатегория, то добавляйте условие в where
если есть подкатегории без товаров и их нужно отображать, то left join и обрабатывайте null

buslikdrev написал:

И ещё подскажите, пожалуйста, sql запросы последовательно идут, если я так запишу?

да

Ошибка в этом месте: find_in_set(p.product_id,replace(replace(replace(replace(p2c.product_ids, '{', ''), '}', ''), ':', ','), '"', ''))

Такой php запрос:
$this->db->query("
        SELECT p2c.`manufacturer_category_id`, MIN(p.`price`) AS dengi1, MAX(p.`price`) AS dengi2
        FROM " . DB_PREFIX . "manufacturer_category p2c
        JOIN " . DB_PREFIX . "product p
        using(p2c.manufacturer_category_id = '" . (int)$manufacturer_category_id . "')
        WHERE find_in_set(p.product_id,replace(replace(replace(replace(p2c.product_ids, '{', ''), '}', ''), ':', ','), '"', ''))
        group by p2c.`manufacturer_category_id`= '" . (int)$manufacturer_category_id . "'
");

Такой sql:
CREATE TABLE IF NOT EXISTS `oc_manufacturer_category` (
`manufacturer_category_id` int(11) NOT NULL,
  `manufacturer_id` int(11) NOT NULL DEFAULT '0',
  `sort_order` int(11) NOT NULL DEFAULT '0',
  `status` int(11) NOT NULL DEFAULT '1',
  `store_id` int(11) NOT NULL,
  `category_image` varchar(255) NOT NULL,
  `product_ids` varchar(255) NOT NULL,
  PRIMARY KEY (`manufacturer_category_id`,`manufacturer_id`)
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;



INSERT INTO `oc_manufacturer_category` (`manufacturer_category_id`, `manufacturer_id`, `sort_order`, `status`, `store_id`, `category_image`, `product_ids`) VALUES
(7, 0, 0, 1, 0, '', '[]'),
(2, 21, 0, 1, 0, 'catalog/series/flash.png', '{"4":"586","5":"590","10":"582","11":"577","12":"578"}'),
(3, 21, 0, 1, 0, 'catalog/series/change.png', '{"2":"571","3":"572","4":"579","5":"583","6":"587"}'),
(4, 21, 0, 1, 0, 'catalog/split/ballu/1484886949390.jpg', '["629","630","631","632"]'),
(5, 21, 0, 1, 0, 'catalog/split/ballu/img-175838859_23157636042276317.jpg', '["623","624","625","626","627","628"]'),
(6, 21, 0, 1, 0, 'catalog/split/ballu/577_01.png', '{"12":"619","13":"620","14":"621","15":"622"}'),
(8, 0, 0, 1, 0, '', '[]'),
(9, 21, 0, 1, 0, 'catalog/series/olympio.png', '{"1":"575","2":"580","3":"584","6":"574"}'),
(12, 21, 0, 1, 0, 'catalog/split/ballu/eco-edge-dc-inverter.jpg', '["633","634","635","636","637"]'),
(13, 21, 0, 1, 0, 'catalog/split/ballu/ballu_bsq_09hn1_1.jpg', '["617"]'),
(14, 13, 0, 1, 0, 'catalog/split/dantex/3ln_enl.jpg', ''

Неактивен

 

#15 06.07.2017 22:48:11

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Выборка из 2х таблиц с чередованием строк

buslikdrev написал:

Ошибка в этом месте: find_in_set(p.product_id,replace(replace(replace(replace(p2c.product_ids, '{', ''), '}', ''), ':', ','), '"', ''))

Что за ошибка?

зачем группировка по `manufacturer_category_id`= что-то ?
и replace-ом ещё нужно удалять квадратные скобки

Неактивен

 

#16 07.07.2017 00:16:59

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

Re: Выборка из 2х таблиц с чередованием строк

vasya написал:

buslikdrev написал:

Ошибка в этом месте: find_in_set(p.product_id,replace(replace(replace(replace(p2c.product_ids, '{', ''), '}', ''), ':', ','), '"', ''))

Что за ошибка?

зачем группировка по `manufacturer_category_id`= что-то ?
и replace-ом ещё нужно удалять квадратные скобки

В php кавычку одну не допускает, она должна быть закрытой.
Сейчас я ищу способ, чтобы создать копию таблицы, но с нормальным видом.

Неактивен

 

#17 16.09.2017 23:43:18

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

Re: Выборка из 2х таблиц с чередованием строк

Я наверное нашёл ответ на мой вопрос по поводу сравнения таблиц при разных видов записи, чтобы достать нужную информацию.

SELECT a.photo
FROM table AS a
WHERE EXISTS (SELECT 1 FROM table AS b WHERE ','||b.his||',' LIKE '%,'||a.id||'-_,%' AND b.id = <определенное id>);

или

SELECT a.his, a.id, b.id, b.photo FROM table a, table b WHERE CONCAT(',', a.his, ',') LIKE CONCAT('%,', b.id, '-_,%') AND a.id = '{определенный id}'

Если данные записаны так: (343-2, 123-1, 453-2)

Суть наверно в том, что выбирает данные с помощью поиска LIKE, а не через удаление ненужных символов.

Неактивен

 

Board footer

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