|
|
Возраст: 45 C нами с 03.03.2006 Репутация: 100.4
|
|
В теме "Помощь по PHP" часто задаются вопросы, связанные с SQL. Думаю, логично будет вынести их в отдельную тему, так как это совершенно другая область обсуждения, являющаяся общей с точки зрения языков программирования.
Добавлено спустя 15 минут 31 секунду:
Начну с сообщения из уже упомянутой темы:
Павлин писал(а): |
Здравствуйте! А можно ли мне как то два запроса обединить в один чтоб связать таблицы?$query = "SELECT users.u_name, sales.t_name, sales.t_ypakovka, sales.klient, sales.stock, sales.number, sales.s_date, sales.rest, sales.period
FROM users LEFT JOIN sales ON sales.u_id = users.u_id
WHERE sales.u_id ='1' and sales.period = '9' GROUP BY sales.t_ypakovka, sales.klient ORDER BY sales.t_name, sales.klient, sales.period";
$query_q = "SELECT tovars.t_package, tovars.t_name, sales.t_name FROM tovars
LEFT JOIN sales ON sales.t_name = tovars.t_name
WHERE sales.t_name ='икра'"; | ? Спасибо!!!
|
Не совсем понятно, что именно надо получить в итоге? Насколько я понял, в первом запросе получается выборка инфо_клиент-инфо_покупка. Во втором инфо_товар-инфо_покупка. Если конечным итогом должно быть что-то типа инфо_клиент-инфо_товар-инфо_покупка, то это легко делается тем же самым JOIN в первый запрос, примерно так:
SELECT users.u_name, tovars.t_package, tovars.t_name,
sales.t_name, sales.t_ypakovka, sales.klient, sales.stock,
sales.number, sales.s_date, sales.rest, sales.period
FROM sales
LEFT JOIN users ON users.u_id = sales.u_id
LEFT JOIN tovars ON tovars.t_name = sales.t_name
WHERE sales.u_id ='1'
AND sales.period = '9'
AND sales.t_name ='икра'
ORDER BY sales.t_name, sales.klient, sales.period
|
|
|
|
|
|
|
|
|
Возраст: 38 C нами с 08.05.2009 Репутация: 5.6
|
|
Делаю запрос а он выдает все варианты товара с одним и тем же объемом не пойму SELECT users.u_name, sales.t_name, sales.t_ypakovka, tovars.t_package, sales.klient, sales.stock, sales.number, sales.s_date, sales.rest, sales.period
FROM tovars, users
LEFT JOIN sales ON sales.u_id = users.u_id WHERE sales.u_id ='1' and sales.period = '9' GROUP BY sales.t_ypakovka, sales.klient ORDER BY sales.t_name, sales.klient, sales.period |
|
_____________________________ Прошу не тыкать в мануал его и так предостаточно!!!
|
|
|
|
|
|
|
Возраст: 45 C нами с 03.03.2006 Репутация: 100.4
|
|
Павлин, у Вас в выборке участвует таблица tovars на которую нет никаких условий. Добавьте условие. Судя по всему, упущено sales.t_name = tovars.t_name
1) Насколько я вижу, основная информация выборки находится в таблице sales. Ее и надо делать основной, а справочные таблицы users и tovars уже использовать в JOIN как дополнительные. У Вас все перепутано.
2) Посоветовал бы использовать синонимы (псевдонимы) таблиц. Во-первых, запрос будет более компактным и читабельным. Во-вторых, часто одна и та же таблица используется в запросе несколько раз, в этих случаях без синонимов не обойтись. К примеру:
SELECT s.*, u1.u_name AS from_name, u2.u_name AS to_name
FROM sales AS s
LEFT JOIN users AS u1 ON u1.u_id = s.from_id
LEFT JOIN users AS u2 ON u2.u_id = s.to_id
|
3) Не рекомендуется смешивать "old style" с перечислением таблиц в FROM и "new style" использующий конструкцию JOIN.
4) Связь таблиц sales и users идет по ключу u_id. Почему связь sales и tovars осуществляется через t_name? По-хорошему, там тоже должен быть ключ типа t_id, а так у вас идет связь по текстовому полю и индексация по нему же? Не гуд!
З.Ы. Переделайте структуру и связи таблиц. Или покажите, что там за таблицы хотя бы. А вообще, во всех учебниках по SQL разбирается именно этот пример с клиентами-продажами, прочитайте и все станет ясно.
|
|
|
|
|
|
|
|
Возраст: 36 C нами с 11.08.2009 Репутация: 42.3
|
|
Подскажите пожалуйста такую штуку:
Есть описание товара в котором присутствуют поля price (FLOAT), special_price (FLOAT), special_price_end_date (DATETIME)
Последние две по умолчанию NULL.
Каким бы образом сделать сортировку по цене, с условием что если установлена special_price_end_date и дата больше нынешней, вместо price использовалась бы special_price при сортировке.
Простыми словами, нужно отсортировать товары по цене, но если установлена специальная цена и дата ее окончания использовать вместо цены спец-цену.
|
|
|
|
|
|
|
|
Возраст: 53 C нами с 01.01.2008 Репутация: 77.1
|
|
как-то так наверное
SELECT ..., IF(special_price_end_date>NOW(), special_price, price) AS sort_price ... ORDER BY sort_price |
|
|
|
|
|
|
|
|
C нами с 31.03.2008 Репутация: 385.1
|
|
Почти. Используйте CASE. Пишу с КПК, подробнее если надо ближе к вечеру.
|
|
|
|
|
|
|
|
Возраст: 36 C нами с 11.08.2009 Репутация: 42.3
|
|
biorobot писал(а): |
как-то так наверное
SELECT ..., IF(special_price_end_date>NOW(), special_price, price) AS sort_price ... ORDER BY sort_price |
|
Спасибо за информацию, но можно немного подробнее?
SELECT ..., IF(special_price_end_date>NOW(), special_price, price) AS sort_price . | [/quote]
Не совсем понятна роль запятых. Положим надо отсортировать всю таблицу `prices` (выбрать все записи) в которой оставим только следующие поля `id`, `price`, `special_price` `special_price_end_date`
Как будет выглядеть запрос?
SELECT * FROM prices WHERE IF(special_price_end_date>NOW(), special_price, price) AS sort_price ORDER BY sort_price ASC
Запятые в условии IF работают как логическое И?
|
|
|
|
|
|
|
|
Возраст: 45 C нами с 03.03.2006 Репутация: 100.4
|
|
biorobot, предложенный вариант пригоден для конкретных БД, в частности MySQL. Однако, подобная конструкция не входит в стандарт SQL92, а потому следует избегать её применения без крайней необходимости.
Вместо неё нужно использовать стандартную CASE:
CASE [expression]
WHEN [value | Boolean expression] THEN [return value]
[ELSE [return value]]
END |
В результате получим что-то такое:
SELECT *,
CASE
WHEN special_price_end_date > NOW() AND special_price IS NOT NULL THEN special_price
ELSE price
END AS sort_price
FROM prices
ORDER BY sort_price ASC |
|
Последний раз редактировалось: NarWhal (21 Апр 2010, 17:53), всего редактировалось 3 раз(а)
|
|
|
|
|
|
|
C нами с 28.10.2005 Репутация: 108.2
|
|
Для MSSQL:
SELECT CASE WHEN special_price_end_date >= GETDATE() THEN special_price ELSE price END FROM Table |
|
|
|
|
|
|
|
|
C нами с 31.03.2008 Репутация: 385.1
|
|
NarWhal, вот. Только с текущей датой сравнить ещё.
|
|
|
|
|
|
|
|
Возраст: 45 C нами с 03.03.2006 Репутация: 100.4
|
|
momwig, да, уже исправил. Просто, я сначала прочитал короткий вариант задачи, цитирую:
"Простыми словами, нужно отсортировать товары по цене, но если установлена специальная цена и дата ее окончания использовать вместо цены спец-цену."
|
|
|
|
|
|
|
|
Возраст: 36 C нами с 11.08.2009 Репутация: 42.3
|
|
NarWhal писал(а): |
momwig, да, уже исправил. Просто, я сначала прочитал короткий вариант задачи, цитирую:
"Простыми словами, нужно отсортировать товары по цене, но если установлена специальная цена и дата ее окончания использовать вместо цены спец-цену."
|
Спасибо огромное, буду пробовать.
+
|
|
|
|
|
|
|
|
C нами с 09.04.2005 Репутация: 0.1
|
|
Добрый день, ищу какую либо книгу по SQL.
Хочется научиться:
1) понимание SQL,
2) практическое применение.
3) для чего? - Для Web, чтобы уметь самостоятельно сделать к примеру www страницу, где можно было бы выбрать то-то и это, нажать кнопку "Выборка". И результат выводился бы.
4) на чём? - Желательно MySQL, Postgresql. В крайнем случае Oracle Free. MSSQL не подходит в принципе.
Почему спрашиваю тут? - Потому что читаю книги по SQL, одна муть, это для этого, то для того... Начинают они с чтения данных а не с создания БД. А мне это не надо, мне бы так:
Открыли книгу, там сказали: поставим MySQL, настроим немного, и поехали, создали базу, положили данные, так то и так то, затем то затем то. Теперь забираем данные так то и так то. - Прям реальные примеры! Проверили? - Работает? Отлично, теперь вот достаньте это и это сами, ответ в конце книги - задачки.
Требования к книге: fb2 формат ОЧЕНЬ желателен, т.к. буду на e-lnk читать. В крайнем случае ссылка на интернет магазин. Или название. Язык en/ru - не имеет значения.
Я уже имею некое представление чего зачем и почему. Поэтому ищу то, что ищу.
Или подскажите где попросить. На sql.ru темы для новеньких не нашёл - но не особо искал. Нашёл интерактивные курсы, но я не хочу учить это постоянно сидя за монитором.
Добавлено спустя 1 час 7 минут 23 секунды:
Цитата: |
SQL presents someone trying to learn the language with
a bit of a catch-22. You need to know how to retrieve
data before you can modify it, because modifying data
means finding the data you want to change. On the
other hand, you need to be able to create a database and
enter some data before you have some data on which
you can perform retrievals. Like Yossarian trying to meet
with Major Major, it doesn’t seem that you can win!
The best alternative is to have someone who knows how
to do it create a sample database and load it with data
for you. Then you can learn to query that database and
carry those techniques over to modifying data. At that
point, you’ll have an understanding of SQL basics and
will be ready to learn to create databases.
|
|
|
|
|
|
|
|
|
Возраст: 38 C нами с 25.01.2005 Репутация: 133
|
|
|
|
|
|
|
|
Возраст: 45 C нами с 03.03.2006 Репутация: 100.4
|
|
Ничем помочь не могу в данном вопросе. Сам обучался по официальной спецификации SQL92 и документациям конкретных реализаций в СУБД (InterBase, Oracle, MSSQL, PostgreSQL, MySQL).
|
|
|
|
|
|
|
|
|