Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Запрос на объединение SQLite  (Прочитано 8239 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Валикос
Гость
« : 29-07-2009 07:18 » new

Всем доброго дня!
Мне нужна помощь, не могу правильно сформировать запрос.
Я использую SQLite.

У меня есть 3 таблицы: меню, заказы и пользователи
Код:
CREATE  TABLE IF NOT EXISTS "menu" (
"id" INTEGER PRIMARY KEY  AUTOINCREMENT,
"date" DATE NOT NULL,
"title" VARCHAR NOT NULL,
"price" REAL NOT NULL);

CREATE  TABLE IF NOT EXISTS "user" (
"id" INTEGER PRIMARY KEY  AUTOINCREMENT,
"name" VARCHAR NOT NULL,
"ip" VARCHAR NOT NULL );

CREATE  TABLE IF NOT EXISTS "ordered" (
"menu_id" INTEGER,
"user_id" INTEGER,
"col" INTEGER,
"date_order" DATE,
FOREIGN KEY ("menu_id") REFERENCES "menu"("id"),
FOREIGN KEY ("user_id") REFERENCES "user"("id"));

CREATE INDEX IF NOT EXISTS "inDate" ON "menu" ("date");

Задача такова: нужно построить таблицу, которая бы выводила заказы на текущий(выбранный) день для конкретного пользователя.
Формат таблицы должен быть примерно такой "| title | price | col |", очень важно выводить как существующие записи из таблицы "ordered" так и не существующие

Вот пример того как должно быть:
Код:
№	Блюдо			        Цена	Количество
1 Окрошка         8        1
2 Суп с фрикадельками 7        1
3 Говядина в грибном соусе9        1
4 Зразы с грибами 7        1
5 Курица по домашнему 9        1
6 Курица с помидорами 6.5        1
7 Отбивная мясная 9        1
8 Плов с курицей 11.5        0
9 Свинина по запорожски 10.5       0
10 Котлета рыбная 9      0
11 Рыба "Версаль" 13      0
12 Рыба по-русски 15 0
13 Гречка         1.5 0
14 Картофель отварной 2.5 0
15 Каша пшеничная 1.5 0
16 Цветная капуста 3 0
17 Салат "Будапешт"         8 0
18 Салат "Деревенский" 3.5 0
19 Салат Свежие помидоры 2.5 0
20 Салат Капуста свежая 2 0
21 Салат Пикантный 4.5 0
22 Салат Радуга         3.75 0
23 Запеканка творожная 3.6 0
Это все счастье на выбор для пользлвателя по id=2, который у меня именуется как Валерий и на дату 2009-08-29
Вот запрос который я использую
Код:
SELECT menu.title, menu.price, ordered.col 
FROM menu
LEFT JOIN ordered
ON menu.id=ordered.menu_id
WHERE ( ordered.user_id=? OR ordered.user_id IS NULL ) AND menu.date=?
Знаки "?" это подставляемые значения

Беда в том что что если на эту же дату (2009-08-29) выводить заказы для другого пользователя, то отсекаются строки с блюдами которые заказаны у пользователя с id=2
Вот что получается, плохо получается
Код:
№  	Блюдо  	                 Цена  		Количество
1 Плов с курицей 11.5         0
2 Свинина по запорожски 10.5 0
3 Котлета рыбная 9 0
4 Рыба "Версаль" 13 0
5 Рыба по-русски 15 0
6 Гречка 1.5 0
7 Картофель отварной 2.5 0
8 Каша пшеничная 1.5 0
9 Цветная капуста 3 0
10 Салат "Будапешт" 8 0
11 Салат "Деревенский" 3.5 0
12 Салат "Свежие помидоры 2.5 0
13 Салат Капуста свежая 2 0
14 Салат Пикантный 4.5 0
15 Салат Радуга 3.75 0
16 Запеканка творожная 3.6 0
Выводятся все только нулевые значения, да еще и не полный прейскурант, что не очень хорошо.
Должно быть 23 блюда, а не 16

Еще был запрос такого плана
Код:
SELECT user.id, menu.title, menu.price, ordered.col
FROM user, menu LEFT JOIN ordered ON (menu.id = ordered.menu_id)
WHERE user.id = ? AND ordered.user_id = user.id AND menu.date = ?
Запрос лабуда.

Может быть имеет смысл использовать подзапросы? Я пока не сильно разобрался в подзапросах.

Буду весьма благодарен если кто поможет решить задачу
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 29-07-2009 08:35 » 

сильно не копал, думаю что проблема в датах
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 29-07-2009 09:06 » 

Я бы так сделал:

Код:
SELECT m.title, m.price, o.col 
FROM menu AS m
  LEFT JOIN ordered AS o
    ON (o.menu_id = m.id AND o.user_id = ?)
WHERE m.date = ?

Полезно добавить:
Код:
ALTER TABLE menu ADD KEY menu_k1 (date);

ALTER TABLE ordered ADD PRIMARY KEY (menu_id, user_id);
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Валикос
Гость
« Ответ #3 : 29-07-2009 09:33 » 

2 RXL
таки да

Код:
SELECT m.title, m.price, o.col 
FROM menu AS m
  LEFT JOIN ordered AS o
    ON (o.menu_id = m.id AND o.user_id = ?)
WHERE m.date = ?

Благодарствую, помогло, вывело все как хотел

А вот это:
Цитата
Полезно добавить:
Код:
ALTER TABLE menu ADD KEY menu_k1 (date);

ALTER TABLE ordered ADD PRIMARY KEY (menu_id, user_id);



то есть сделать поля (menu_id, user_id) из "ordered" не вторичными а первичными ключами, я так понимаю?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines