Вверх ↑
Этот топик читают: Гость
Ответов: 952
Рейтинг: 4
#841: 2011-12-13 23:48:40 ЛС | профиль | цитата
Номер заявки, тип данных REAL, при выводе в стрингтабл номер отображается с десятичным. Т.е. например 365.0
Как этого избежать? Выставить тип INTEGER ?
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#842: 2011-12-13 23:54:14 ЛС | профиль | цитата
user_asm писал(а):
Выставить тип INTEGER

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 952
Рейтинг: 4
#843: 2011-12-15 00:18:52 ЛС | профиль | цитата
Добавил в таблицу пару столбцов. В один из них вставил одинаковые данные. Второй пуст.
Сделал вакуум.
Внес для теста пару записей. Форма Редактировать с новыми записями работает корректно.
А со старыми записям беда - форма Редактировать пуста.
Т.е. при запросе получается следующее
select * FROM base WHERE (nomer="532")AND(dataz="")
Похоже что из-за пустого dataz и не идет запрос.
Как выйти из положения? Думал внести во все старые записи одинаковую дату, но как-то не очень такое решение.
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#844: 2011-12-15 00:32:59 ЛС | профиль | цитата
Если nomer integer, то select * FROM base WHERE (nomer=532)AND(dataz="");
Но если у тебя есть конкретный nomer, то нахрена тебе dataz ? Или у тебя 532 на все записи ?
Тогда так:
SELECT * FROM base WHERE nomer=532;

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 952
Рейтинг: 4
#845: 2011-12-15 00:40:31 ЛС | профиль | цитата
Не выбирает так:
select * FROM base WHERE (nomer=532)AND(dataz="");
Запрос проходит без ошибок но ничего не выдает.
Если заполнить пустой столбец одинаковыми данными, типа 2012-01-01, то запрос проходит и возвращает что нужно.
карма: 0

0
Ответов: 758
Рейтинг: 112
#846: 2011-12-15 14:38:14 ЛС | профиль | цитата
Вопрос к гуру
code_26195.txt
1. Каким запросом можно вывести все названия из tab1 и одновременно sum(tab2.amount)
То есть получить что-то такое
namesum
Апельсин15
Лайм5
Мандарин20
Лимон
2. Никак не могу понять принцип работы индексов. Точнее не магу понять разницу между простым столбиком и индексом.
Прошу перевести данный пример на индекс (один ко многому)
карма: 1

0
файлы: 1code_26195.txt [1.7KB] [399]
Ответов: 171
Рейтинг: 19
#847: 2011-12-15 19:34:04 ЛС | профиль | цитата
miver,
#sql
SELECT tab1.name, sum(tab2.amount) FROM tab1 LEFT JOIN tab2
ON tab1.id = tab2.idTab1 GROUP BY 1;
карма: 0

2
Голосовали:miver, Tad
Ответов: 758
Рейтинг: 112
#848: 2011-12-15 20:18:18 ЛС | профиль | цитата
Borka, а можно немного пояснить что к чему. В часности "tab1 LEFT JOIN tab2 ON" и почему нет WHERE
карма: 1

0
Ответов: 3889
Рейтинг: 362
#849: 2011-12-15 20:27:56 ЛС | профиль | цитата
miver писал(а):
почему нет WHERE

После ON идёт условие и склейка таблиц JOIN, LEFT указывает с какой стороны приклеивать.
карма: 1

0
Ответов: 171
Рейтинг: 19
#850: 2011-12-15 23:00:57 ЛС | профиль | цитата
miver писал(а):
а можно немного пояснить что к чему. В часности "tab1 LEFT JOIN tab2 ON" и почему нет WHERE

Ваш изначальный запрос
#sql
SELECT tab1.name, sum(tab2.amount) FROM tab1, tab2 WHERE tab1.id = tab2.idTab1 GROUP BY 1;
Эквивалентен запросу с INNER JOIN
#sql
SELECT tab1.name, sum(tab2.amount) FROM tab1 INNER JOIN tab2
ON tab1.id = tab2.idTab1
GROUP BY 1;

INNER JOIN выводит данные с совпадающими id
В этом случае можно использовать или ON или WHERE нет особой разницы

А вот в случае с LEFT JOIN который объединяет все данные из таблиц , нужно строго следовать синтаксису и использовать ON (Это связано с тем что WHERE как то не так обрабатывает NULL который появляется при объединении таблиц где условия не совпадают... но это знать необязательно )
карма: 0

2
Голосовали:Konst, miver
Ответов: 16884
Рейтинг: 1239
#851: 2011-12-16 00:15:04 ЛС | профиль | цитата
miver, и на пальцах:
Как написано в строке запроса FROM tab1 LEFT JOIN tab2 - ко всем значениям левой таблицы(tab1 - написано слева от слова JOIN), присоединить данные из правой таблицы (tab2 - написано справа от слова JOIN).
WHERE (где) - возвращает результат запроса только когда результат сравнения TRUE.
ON (на) - возвращает результат запроса когда результат сравнения TRUE, или подставляет NULL при невозможности выполнить сраавнение.

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
Голосовали:miver
Ответов: 758
Рейтинг: 112
#852: 2011-12-16 11:02:48 ЛС | профиль | цитата
Всем большое спасибо.
Пожалуйста, объясните также на пальцах про индексы.
Теоретически я знаю, как их сделать. А на практике не понимаю зачем они и в каких случаях используются.
карма: 1

0
Гость
Ответов: 17029
Рейтинг: 0
#853: 2011-12-16 13:06:24 правка | ЛС | профиль | цитата


Редактировалось 2 раз(а), последний 2021-05-22 09:04:41
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#854: 2011-12-16 13:07:07 ЛС | профиль | цитата
miver, на пальцах
Индексные файлы используются движком теоретически для ускорения доступа к данным таблицы.
При создании колонки как PRIMARY KEY или UNIQUE для этих колонок автоматом создаются индексные файлы.
Командой CREATE INDEX можно создать индексный файл для любой колонки.

Не всегда происходит ускорение доступа - чаще замедление при операциях INSERT, DELETE, UPDARE и при создании индексного файла для текстовых колонок с очеь длинными строками.



карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#855: 2011-12-16 16:23:05 ЛС | профиль | цитата
Tad, слушай -- а как мне выставить запрос с условием. Предпложим -- есть две таблицы, из одной получаем индекс и берем значение в другой таблице по полученному индексу, но если индекс не больше какого-то значения, а иначе от индекса надо отнять какое-то значение. По типу условия -- если полученный индекс не больше определенного значени, то используем индекс "как есть", иначе -- отнимаем от индекса какое-то значение. Реально ли это сделать в одном запросе, или надо лепить дополнительные компоненты условия
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)