Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день,
Есть две таблицы photo и video с одинаковыми полями, нужно сделать выборку всех строк с чередованием.
Т.е например 3 строки первой таблицы photo, 1 строка из второй video и так далее до конца.
Помогите, не могу найти как это сделать.
Неактивен
Удивительная постановка задачи, проще выбрать обе таблицы и на клиенте уже формировать тот порядок, который Вам нужен.
А что значит 3 строки? По каком критерию упорядочиваем?
А так вообще нужно union пользоваться для такого.
Неактивен
Я так и не нашла ответ на свой вопрос.
Попробую объяснить еще раз.
Есть 2 таблицы `фото` и `видео` с одинаковыми колонками `id`. `title` и т.д.
Я хочу выбрать все записи из обеих таблиц, но чтобы через каждые две строки из `фото` вставлялась одна из `видео`
не зависимо от количества строк в обеих таблицах
Должно получиться Фото.id1 Фото.id2 Фото.id3 Видео.Id1 Фото.id4 Фото.id5 Фото.id6 Видео.Id2
Неактивен
В своем ответе я задал Вам несколько вопросов, они не были риторическими ;-).
Опять же, писал
А покажите пример данных в обеих таблицах? Может быть что-то получше придумается.
Не наблюдаю примера данных в Вашем ответе.
Неактивен
deadka,
union зависит от кол-ва данных или писать заведомо большой запрос
имхо, переменные рулят:
фото нумеруем - 1,2,3,11,12,13,21,22,23,...
видео - 5,15,25,...
Неактивен
vasya, нам ли не знать, что переменные - это шикарный способ выстрелить себе в ногу .
Union - совершенно согласен, но формально это ответ на вопрос ТС.
>Фото.id1 Фото.id2 Фото.id3 Видео.Id1 Фото.id4 Фото.id5 Фото.id6 Видео.Id2
Чтобы получить такой результат имхо нужно сделать две выборки - одну из таблицы с фото, другую из таблицы и спокойно на клиенте их отчередовать.
Так что дополнительный вопрос к ТС - зачем делать это одним запросом? Это вообще учебная задача в институте или рабочая (где не очень важно, как сделать, важен результат)?
Неактивен
vasya написал:
deadka,
union зависит от кол-ва данных или писать заведомо большой запрос
имхо, переменные рулят:
фото нумеруем - 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)
Неактивен
Не стоит так делать - через запятую. Но если уж такова структура и менять нельзя - что значит "сравнить"? Формализуйте задачу.
Неактивен
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)
Неактивен
Неактивен
vasya написал:
select t2.* from t1 join t2 using(id_cat) whereнайдет id товара из второй таблицы, которые присутствуют в первой.
find_in_set(t2.id_tov,replace(replace(replace(replace(t1.id_tov, '{', ''), '}', ''), ':', ','), '"', ''));
Но работать будет медленно. Добавьте во вторую таблицу id подкатегории производителя.
Во вторую таблицу лучше не добавлять ничего - оригинальная таблица, вот в первую таблицу можно вертеть что-то, но если изменить в ней что-то это означает переписывать весь код модуля который не я создавал, а мне лишь дали задание вывести в подкатегориях минимальную и максимальную цену, которые создаёт этот модуль Я не знал, что с этим столкнусь, зато знания в копилку. Сейчас попробую ваш метод, спасибо, отпишусь.
Отредактированно buslikdrev (05.07.2017 21:02:50)
Неактивен
vasya написал:
select t2.* from t1 join t2 using(id_cat) whereнайдет id товара из второй таблицы, которые присутствуют в первой.
find_in_set(t2.id_tov,replace(replace(replace(replace(t1.id_tov, '{', ''), '}', ''), ':', ','), '"', ''));
Но работать будет медленно. Добавьте во вторую таблицу 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)
Неактивен
Что-то я запутался в ваших рассуждениях. Сравнить значение из столбца со строкой вы можете с помощью find_in_set. Чтобы найти максимальную и минимальную цену во всех подкатегориях, содержащих товары:
buslikdrev написал:
И ещё подскажите, пожалуйста, sql запросы последовательно идут, если я так запишу?
да
Неактивен
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 и обрабатывайте nullbuslikdrev написал:
И ещё подскажите, пожалуйста, 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', ''
Неактивен
buslikdrev написал:
Ошибка в этом месте: find_in_set(p.product_id,replace(replace(replace(replace(p2c.product_ids, '{', ''), '}', ''), ':', ','), '"', ''))
Что за ошибка?
зачем группировка по `manufacturer_category_id`= что-то ?
и replace-ом ещё нужно удалять квадратные скобки
Неактивен
vasya написал:
buslikdrev написал:
Ошибка в этом месте: find_in_set(p.product_id,replace(replace(replace(replace(p2c.product_ids, '{', ''), '}', ''), ':', ','), '"', ''))
Что за ошибка?
зачем группировка по `manufacturer_category_id`= что-то ?
и replace-ом ещё нужно удалять квадратные скобки
В php кавычку одну не допускает, она должна быть закрытой.
Сейчас я ищу способ, чтобы создать копию таблицы, но с нормальным видом.
Неактивен
Я наверное нашёл ответ на мой вопрос по поводу сравнения таблиц при разных видов записи, чтобы достать нужную информацию.
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, а не через удаление ненужных символов.
Неактивен