Имя:    Пароль:      Помнить меня       
Unsorted   ~  Software  ~  Development and Design  ~  Помощь по SQL Составление запросов, оптимизация, T-SQL, PL/SQL и прочее
На страницу 1, 2  »
NarWhal
Сообщение  14 Июл 2009, 13:39  Ссылка : Ответить с цитатой
Возраст: 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
В начало
Профиль : Фотоальбом : Личное Сообщение
Павлин
Сообщение  15 Июл 2009, 15:56  Ссылка : Ответить с цитатой
Возраст: 37 Пол: Мужской 
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

_____________________________
Прошу не тыкать в мануал его и так предостаточно!!!
В начало
Профиль : Личное Сообщение : Сайт : SkypeID : ICQ
NarWhal
Сообщение  15 Июл 2009, 16:36  Ссылка : Ответить с цитатой
Возраст: 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 разбирается именно этот пример с клиентами-продажами, прочитайте и все станет ясно.
В начало
Профиль : Фотоальбом : Личное Сообщение
Dee_Ecks
Сообщение  21 Апр 2010, 17:07  Ссылка : Ответить с цитатой
Возраст: 35 Пол: Мужской 
C нами с 11.08.2009
Репутация: 42.3

Подскажите пожалуйста такую штуку:
Есть описание товара в котором присутствуют поля price (FLOAT), special_price (FLOAT), special_price_end_date (DATETIME)

Последние две по умолчанию NULL.

Каким бы образом сделать сортировку по цене, с условием что если установлена special_price_end_date и дата больше нынешней, вместо price использовалась бы special_price при сортировке.

Простыми словами, нужно отсортировать товары по цене, но если установлена специальная цена и дата ее окончания использовать вместо цены спец-цену.
В начало
Профиль : Блог : Личное Сообщение : ICQ
biorobot
Сообщение  21 Апр 2010, 17:17  Ссылка : Ответить с цитатой
Возраст: 53 Пол: Мужской  Доверенный пользователь
C нами с 01.01.2008
Репутация: 77.1

как-то так наверное
SELECT ..., IF(special_price_end_date>NOW(), special_price, price) AS sort_price ... ORDER BY sort_price
В начало
Профиль : Личное Сообщение
momwig
Сообщение  21 Апр 2010, 17:34  Ссылка : Ответить с цитатой
Пол: Мужской  Доверенный пользователь
C нами с 31.03.2008
Репутация: 385.1

Почти. Используйте CASE. Пишу с КПК, подробнее если надо ближе к вечеру.
В начало
Профиль : Личное Сообщение
Dee_Ecks
Сообщение  21 Апр 2010, 17:40  Ссылка : Ответить с цитатой
Возраст: 35 Пол: Мужской 
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 работают как логическое И?
В начало
Профиль : Блог : Личное Сообщение : ICQ
NarWhal
Сообщение  21 Апр 2010, 17:42  Ссылка : Ответить с цитатой
Возраст: 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 раз(а)
В начало
Профиль : Фотоальбом : Личное Сообщение
Viewer
Сообщение  21 Апр 2010, 17:48  Ссылка : Ответить с цитатой
Пол: Мужской  Доверенный пользователь
C нами с 28.10.2005
Репутация: 108.2

Для MSSQL:

SELECT CASE WHEN special_price_end_date >= GETDATE() THEN special_price ELSE price END FROM Table
В начало
Профиль : Личное Сообщение
momwig
Сообщение  21 Апр 2010, 17:53  Ссылка : Ответить с цитатой
Пол: Мужской  Доверенный пользователь
C нами с 31.03.2008
Репутация: 385.1

NarWhal, вот. Только с текущей датой сравнить ещё.
В начало
Профиль : Личное Сообщение
NarWhal
Сообщение  21 Апр 2010, 17:55  Ссылка : Ответить с цитатой
Возраст: 45 Пол: Мужской 
C нами с 03.03.2006
Репутация: 100.4

momwig, да, уже исправил. Просто, я сначала прочитал короткий вариант задачи, цитирую:
"Простыми словами, нужно отсортировать товары по цене, но если установлена специальная цена и дата ее окончания использовать вместо цены спец-цену."

Улыбочка
В начало
Профиль : Фотоальбом : Личное Сообщение
Dee_Ecks
Сообщение  21 Апр 2010, 18:12  Ссылка : Ответить с цитатой
Возраст: 35 Пол: Мужской 
C нами с 11.08.2009
Репутация: 42.3

NarWhal писал(а):
momwig, да, уже исправил. Просто, я сначала прочитал короткий вариант задачи, цитирую:
"Простыми словами, нужно отсортировать товары по цене, но если установлена специальная цена и дата ее окончания использовать вместо цены спец-цену."

Улыбочка

Спасибо огромное, буду пробовать.
+
В начало
Профиль : Блог : Личное Сообщение : ICQ
DALDON
Сообщение  07 Июн 2010, 14:45  Ссылка : Ответить с цитатой
Пол: Мужской  Доверенный пользователь
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.
В начало
Профиль : Фотоальбом : Блог : Личное Сообщение
Doctor_Mozg
Сообщение  08 Июн 2010, 12:00  Ссылка : Ответить с цитатой
Возраст: 37 Пол: Мужской  Доверенный пользователь
C нами с 25.01.2005
Репутация: 133

http://www.pixel2life.com/tutorials/mysql/ - посмотри тут. Как раз 90+ туторов по мускулу. Пробежался взглядом - вроде хорошие Улыбочка

А теорию я учил по книге Грабера: http://www.ozon.ru/context/detail/id/929001/
Самое оно.

_____________________________
Это ты, Джон Уэйн?
В начало
Профиль : Фотоальбом : Блог : Личное Сообщение : ICQ
NarWhal
Сообщение  08 Июн 2010, 14:36  Ссылка : Ответить с цитатой
Возраст: 45 Пол: Мужской 
C нами с 03.03.2006
Репутация: 100.4

Ничем помочь не могу в данном вопросе. Сам обучался по официальной спецификации SQL92 и документациям конкретных реализаций в СУБД (InterBase, Oracle, MSSQL, PostgreSQL, MySQL).
В начало
Профиль : Фотоальбом : Личное Сообщение
Показать сообщения:   
На страницу 1, 2  »

Unsorted   ~  Software  ~  Development and Design  ~  Помощь по SQL

Ответить на тему

Перейти:  





Powered by phpBB   © Unsorted Team  support@unsorted.me  promo@unsorted.me  Полезные скрипты