|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
Опять я вас достаю своими проблемами - но прошу извинить - больше обратится некуда, а я в TSQL хреново понимаю... Есть две таблицы: tovar - таблица характеристик товаров ================ Kod - уникальный код товара Name - название товара ================ zena - таблица с историями цен товаров ================ Kod - код товара Data - дата установки цены на товар Price - значение цены на дату ================ Как можно сделать выборку, что бы в нее попали название товаров и цены этих товаров на определенную дату? Типа такая должна быть картина: +=========================+=======+ | Товар | Цена | +=========================+=======+ Телевизор Sony E-25 7000 Чайник Скарлет-1022 800 Утюг PHILIPS-78 950 ================================== Можно-ли это сделать опять-таки одним запросом, без временных таблиц? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2003, 15:56 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2003, 16:07 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Как то так должно работать. По крайне мере результат сходится. Писал на Transact-SQL (у меня SQL Server), так что адаптируеш сам. Сорри за корявое оформление. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2003, 16:34 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
Он бы адаптировал. Только навряд ли у него есть вложенные запросы в MySQL! 2BigHarry, у делали-же с этой базой уже что-то тут?! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2003, 16:57 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
Да - это для МуСкуля... Тама вложенных запросов (в трешке) точно нету. Четверка - ещо сырая, что бы ее ставить... (2) mahoune - да - делали, но там была другая проблема - и она не без вашей помощи разрешилась... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2003, 17:28 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
Короче говоря.... 1. если тебе нужен запрос, который тебе выдает - у каких товаров были изменения по цене за данную дату, то никаких проблем: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Соотвествно, он не выведет тебе товары, у которых не было изменения цены за данное число. 2. если тебе нужен запрос, который тебе выдает - были ли изменения по цене у товаров за данную дату, то тоже никаких проблем: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
3. если тебе нужен запрос, который выберет ближайшее изменение к этой дате, то лично у меня возникли проблемы, которые я решил таким способом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
только придется выделять на стороне клиента цену из поля diff (разделитель, в моем случае, 0101010101. он должен быть числовым). 4. Если чего то еще, то пиши Удачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2003, 19:07 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
P.S. Четверка, то вроде уже не сырая, покрайней версия 4.012 (источник новость на MySQL.com) рекомендованна к использованию.... Вот только вложенных запросов в ней попрежнему нету. :( P.S. Последний пример: мона разбивать и в Мускуле (чего то мысля дальше не пошла :( ), и такой пример описываеться в доке на все том же MySQL.com http://www.mysql.com/doc/ru/example-Maximum-column-group-row.html и назван не эффективным... :(. Ну это я и сам знал. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2003, 19:18 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
P.P.P.S чего-то Артем разошелся.... Два вложенных запроса.... Ни есть гуд. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2003, 19:37 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
(2) medved Что-то не получается... Мне нужна возможность получать цену по товарам на определенную дату (дата задается юзером). Я попробовал твой третий вариант, но почему-то он выдает неправильный результат: Имеется такая запись в таблице Zena Код: plaintext 1. 2. 3.
Что бы узнать цену на дату 03-02-2003 (цена должна быть 11790) запрос: select tovar.Name, min(CONCAT(ABS(to_days(zena.Data)- to_days("2003-02-03")), "0101010101", zena.Price)) as _diff, Data from zena, tovar where tovar.kod='5730' AND (tovar.Kod = zena.Kod) group by tovar.Kod; возвращает значение 12190, а такое значение цены должно быть позжее. Может - как-то извратиться с временной выборкой? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2003, 12:00 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
Странно, но правильный результат выдает следующий запрос (искомая дата - 01.02.2003): Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2003, 12:38 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
Моя таблица zena Kod Data Price 5618 2002-12-30 900 5618 2003-01-25 920 5618 2003-03-02 950 1077 2002-12-30 750 1077 2003-02-18 800 3388 2002-12-30 6580 3388 2003-01-15 7200 3388 2003-03-02 7000 5730 2002-12-31 11290 5730 2003-01-06 11790 5730 2003-02-05 12190 Твой запрос Код: plaintext 1. 2. 3.
результат твоего запроса Kod Name Price 1077 Чайник Скарлет-1022 750 3388 Телевизор Sony E-25 6580 5618 Утюг PHILIPS-78 900 Для товара с кодом 5618 цена ближайшая по дате к к дате "2003-02-01", "920" за дату 2003-01-25. Твой запрос выводит не эту, он выводит первую запись с датой меньше чем ты задал Мой запрос Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
результат моего запроса Name _diff Чайник Скарлет-1022 170101010101 800 Телевизор Sony E-25 17010101010 17200 Утюг PHILIPS-78 290101010101 950 Проверяем: Код товара 3388 ближайшая по дате цена 7200 за 2003-01-15 Код товара 5618 ближайшая по дате цена 920 за 2003-01-25 Код товара 1077 ближайшая по дате цена 800 за 2003-02-18 Я поставил там abs для того что бы считало как и после заданой даты так и до... Если тебе надо ближайшая цена с датой меньше заданной надо Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
А мой запрос у меня лично не работает потому что у меня нет товара с кодом 5730... Как только я его добавил все появилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2003, 13:45 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
"А мой запрос у меня лично не работает потому что у меня нет товара с кодом 5730... Как только я его добавил все появилось." - я хотел сказать что вот этот запрос не работает: select tovar.Name, min(CONCAT(ABS(to_days(zena.Data)- to_days("2003-02-03")), "0101010101", zena.Price)) as _diff, Data from zena, tovar where tovar.kod='5730' AND (tovar.Kod = zena.Kod) group by tovar.Kod; ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2003, 13:47 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
Да - мой запрос лажает... Твой, который последний - похоже то, что нужно, вот только столбец, который он возвращает - какой-то некузявный - из него ещо надо каким-то макаром вычипить цену... Пойду гляну в ману - надо же хоть до чего-то самому допереть... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2003, 14:18 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
Сделал так: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Вроде - все нормально - теперь цену можно отделить по поиску подстроки # Блин, хочется что бы цену в нормальном виде не на клиенте обрабатывать, а получать в виде числа с сервера, иначе - тормозит... А каким запросом можно скинуть цены на определенную дату во временную таблицу (при условии что дата цены меньше или равна требуемой даты)? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2003, 14:33 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
Ну если пхп то где-нидь так: Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2003, 14:34 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
Не - не для пхп, надо как столбец в Дельфи, и тама должно быть число... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2003, 14:44 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
Нифига не получаеться! Помогите, плиз, как мне сделать выборку в другую таблицу, типа так: Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2003, 15:48 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Ну теперь в поле _price цена товара ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2003, 18:30 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
Я уже выкрутился, через темповую таблу. Хотел сначала через строковые функции, как ты и предложил, но выражение получалось запарно-длинное - я подумал, что Мускуль быстрее с темповой таблой прокрутится... Вот что получилось: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2003, 13:57 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
Один SQL: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
через TEMP таблицу будет быстрее Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2003, 17:09 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
Проверил - первый запрос вааще ничего не возвращает - ошибки нет, но и выборка пуста, а второй - почти такой-же, как и у меня, только - у меня ещо индекс построен по коду в темповой таблице, иначе LEFT JOIN минуты две-три выстраивается, и при этом ресурсы мускуль начинает отжирать... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2003, 17:52 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
первый запрос для приведенных здесь данных на дату 2003-02-03 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Насчет второго варианта - временная таблица создается как HEAP (в памяти), следовательно индексы для нее не нужны. Если у тебя большой объем данных (в память не влезет), то нужно пересмотреть конструкцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2003, 18:13 |
|
Хитрая выборка из двух таблиц
|
|||
---|---|---|---|
#18+
В общем - обломился - мой вариант не дает правильных данных. Что бы эта ветка никого не ввела в заблуждение и кто-то не напоролся на грабли, вот правильный запрос: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
В данном случае в темпоральную таблицу будут вставляться данные в порядке возрастания дат, а поскольку код является примари - то вставить более чем одной записи с кодом мускуль не даст. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2003, 12:18 |
|
|
start [/forum/topic.php?fid=47&msg=32131951&tid=1855900]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 159ms |
0 / 0 |