Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 07.05.2016
Сообщений: 11
1

Создание вложенного запроса

04.07.2016, 21:44. Просмотров 278. Ответов 7
Метки нет (Все метки)

Просьба помочь создать запрос для следующей задачи.
В БД есть строки со следующими полями:
id | hotel_id | date_begin | date_end | price | currency
И, например, значениями

1 | 300 | 01.07.2016 | 09.07.2016 | 100 | usd
2 | 300 | 10.07.2016 | 19.07.2016 | 200 | usd
3 | 300 | 20.07.2016 | 29.07.2016 | 150 | usd

Пользователь вводит в поисковой форме разброс дат с 05.07.2016 по 21.07.2016
Количество дней: 7
и сумму за проживания от 1000 $ до 1500 $

В результате надо найти все отрезки дат подходящие под эти условия с подсчитанной суммой.
Например, первый найденный отрезок будет: с 06.07.2016 по 12.07.2016 и стоимостью проживания 1000 $
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.07.2016, 21:44
Ответы с готовыми решениями:

Использование вложенного запроса
В толстом клиенте есть запрос, который выводит список. На форму добавлен флажок. Если значение -...

Реализация вложенного запроса
Помогите с задачей. Есть 3 таблицы. Склады(storage) , арендаторы(tenantry) ,...

Построение вложенного запроса
Добрый день. Мне нужно построить запрос с использованием вставляемого значения, который в поле ГОД...

Обращение к полю из вложенного запроса
Есть запрос, который выводит информацию об объекте, который связан с максимальным числом объектов...

7
25 / 25 / 20
Регистрация: 12.05.2016
Сообщений: 181
05.07.2016, 18:40 2
Сделайте колонку в которую,занесите количество дней,а тогда используйте такой запрос:

SQL
1
SELECT * FROM `prices` WHERE price = '$price' && days = '$days' && date_begin BETWEEN '$from' AND '$to'
0
4 / 4 / 6
Регистрация: 29.05.2016
Сообщений: 20
06.07.2016, 11:09 3
Masterlelik, вы используете MySQL? Если да, то покажите структуру таблицы.

MySQL
1
show columns from `table`
Пользователь указывает количество дней. За эти дни он может пребывать в разных отелях?

Ваша задача является практической или учебной?
0
0 / 0 / 0
Регистрация: 07.05.2016
Сообщений: 11
06.07.2016, 11:35  [ТС] 4
"Пользователь указывает количество дней. За эти дни он может пребывать в разных отелях?"
нет не может - только один отель

Задача практического характера
Field | Type | Null | Key | Default | Extra
id | mediumint(8) unsigned | NO | PRI | NULL | auto_increment
tour_id | mediumint(8) unsigned | NO | MUL | NULL
hotel_id | mediumint(8) unsigned | NO | MUL | NULL
room | varchar(255) | NO | MUL | NULL
price | smallint(5) unsigned | NO | NULL
currency | tinyint(3) unsigned | NO | NULL
date_begin | date | NO | NULL
date_end | date | NO | NULL

Добавлено через 5 минут
@codding_hanter
для проживания в отеле нет фиксированного количества дней проживания - можно взять как 2 дня, так и 30 дней. Все зависит от кошелька туриста.
0
4 / 4 / 6
Регистрация: 29.05.2016
Сообщений: 20
06.07.2016, 11:49 5
Вы можете дать мне ссылку на ваш сайт? Можете написать мне в ЛС, если хотите.
0
25 / 25 / 20
Регистрация: 12.05.2016
Сообщений: 181
06.07.2016, 16:27 6
Цитата Сообщение от Masterlelik Посмотреть сообщение
для проживания в отеле нет фиксированного количества дней проживания - можно взять как 2 дня, так и 30 дней. Все зависит от кошелька туриста.
date_begin
date_end - ето отрезок времени который он будет жить в отеле, или же на сколько он может снять комнату?
0
0 / 0 / 0
Регистрация: 07.05.2016
Сообщений: 11
08.07.2016, 06:46  [ТС] 7
date_begin
date_end
это общий отрезок когда он рассматривает возможность заезда, например может смотреть с 1го по 30е число, и ему надо получить все 7ми дневные отрезки, которые входят в эти 30 дней и отвечают его запросу по цене.
0
4 / 4 / 6
Регистрация: 29.05.2016
Сообщений: 20
13.07.2016, 21:13 8
PHP
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
<?php
 
error_reporting(-1);
ini_set('display_errors', 0);
 
$date1 = '2016-07-05';
$date2 = '2016-07-21';
$days_number = 7;
$min_price = 1000;
$max_price = 1500;
 
function check_date($date)
{
    if (!preg_match('/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/', $date)) return false;
    
    list($y, $m, $d) = explode('-', $date);
    $y = intval($y);
    $m = intval($m);
    $d = intval($d);
    
    return ($y >= 1000 and $y <= 9999 and $m >= 1 and $m <= 12 and $d >= 1 and $d <= max_days($m, $y));
}
 
function max_days($month, $year)
{
    if (!is_int($month) or !is_int($year) or $month < 1 or $month > 12 or $year < 1000 or $year > 9999) return false;
    
    if ($month == 2) return ($year % 4) ? 28 : 29;
    
    $months = array(31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    
    return $months[$month - 1];
}
 
function dates_interval($date1, $date2)
{
    if (!check_date($date1) or !check_date($date2) or strcmp($date1, $date2) > 0) return false;
        
    $r = array($date1);
    
    if ($date1 == $date2) return $r;
    
    list($y, $m, $d) = explode('-', $date1);
    $y = intval($y);
    $m = intval($m);
    $d = intval($d);    
        
    while (true)
    {
        $d++;
        if ($d > max_days($m, $y))
        {
            $d = 1;
            $m++;
            if ($m > 12)
            {
                $m = 1;
                $y++;
            }
        }
        
        $date_ = sprintf('%04d-%02d-%02d', $y, $m, $d);
        $r[] = $date_;
        
        if ($date_ == $date2) break;
    }
    
    return $r;  
}
 
$dates = dates_interval($date1, $date2);
 
$indexes = array_flip($dates);
 
$intervals_number = count($dates) - $days_number + 1;
 
$results = array();
 
if (!$mysql = mysqli_connect('host', 'user', 'password', 'dbname')
    or !mysqli_set_charset($mysql, 'utf8')
    or !$r = mysqli_query($mysql, "select max(`hotel_id`) as `max_hotel_id` from `table`"))
{
    echo 'Произошла ошибка.';
    exit;
}
 
$max_hotel_id = mysqli_fetch_assoc($r);
$max_hotel_id = intval($max_hotel_id['max_hotel_id']);
 
mysqli_free_result($r);
 
$query_limit = 100;
 
$remainder = $max_hotel_id % $query_limit;
$queries_number = ($max_hotel_id - $remainder) / $query_limit;
if ($remainder) $queries_number++;
 
for ($query_number = 0; $query_number < $queries_number; $query_number++)
{
    $id1 = $query_number * $query_limit + 1;
    $id2 = ($query_number + 1) * $query_limit;
 
    if (!$r = mysqli_query($mysql, "select * from `table` where `hotel_id` >= $id1 and `hotel_id` <= $id2 and`date_begin` <= '$date2' and `date_end` >= '$date1' and `date_begin` <= `date_end`"))
    {
        echo 'Произошла ошибка.';
        exit;
    }
 
    $prices = array();
 
    $hotel_ids = array();
 
    while ($row = mysqli_fetch_assoc($r))
    {
        $h = intval($row['hotel_id']);
        $d1 = $row['date_begin'];
        $d2 = $row['date_end'];
        $p = intval($row['price']);
    
        if (strcmp($d1, $date1) < 0) $d1 = $date1;
        if (strcmp($d2, $date2) > 0) $d2 = $date2;
    
        if (!isset($prices[$h])) 
        {
            $prices[$h] = array();
            $hotel_ids[] = $h;
        }
    
        for ($i = $indexes[$d1], $j = $indexes[$d2]; $i <= $j; $i++) $prices[$h][$i] = $p;
    }
 
    mysqli_free_result($r);
 
    if ($hotel_ids)
        foreach ($hotel_ids as $hotel_id)
            for ($index = 0; $index < $intervals_number; $index++)  
            {
                $p = 0;
        
                for ($i = $index, $j = $index + $days_number - 1; $i <= $j; $i++)
                {
                    if (!isset($prices[$hotel_id][$i])) continue 2;
            
                    $p += $prices[$hotel_id][$i];
                }
        
                if ($p >= $min_price and $p <= $max_price)
                {
                    if (!isset($results[$hotel_id])) $results[$hotel_id] = array();
            
                    $results[$hotel_id][] = array('date1' => $dates[$index], 'date2' => $dates[$index + $days_number - 1], 'price' => $p);
                }
            }
}
 
mysqli_close($mysql);
 
if (!$results)
{
    echo 'Результаты не найдены.';
    exit;
}
 
$table = '<style>td { border: 1px solid black; padding: 10px; }</style><table>';
 
foreach ($results as $hotel_id => $value)
{
    $table .= "<tr><td colspan=3>$hotel_id</td></tr>";
    foreach ($value as $i) $table .= "<tr><td>" . $i['date1'] . "</td><td>" . $i['date2'] . "</td><td>" . $i['price'] . "</td></tr>";
}
 
$table .= '</table>';
 
echo $table;
В этом коде не учитывается поле currency.

Цитата Сообщение от Masterlelik Посмотреть сообщение
date_begin
date_end
это общий отрезок когда он рассматривает возможность заезда, например может смотреть с 1го по 30е число, и ему надо получить все 7ми дневные отрезки, которые входят в эти 30 дней и отвечают его запросу по цене.
Нет, date_begin и date_end это поля в таблице.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2016, 21:13

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

Составление вложенного SQL запроса
С использованием вложенных запросов в операторе HAVING, найти количество читателей ...

Ошибка при создании вложенного запроса
Создаю запрос для вывода всех различных значений по полю ProizvTovara, но выбивает ошибка:...

Подстановка результата вложенного запроса в INSERT INTO
Всем доброго времени суток. У меня имеется таблица catalog, в ней есть 2 столбца: id_title и...

Выборка нескольких полей из вложенного запроса
Здравствуйте! Допустим есть 2 таблицы: Описание реквизита ATTRIBUTES с полями ID, CODE, NAME...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.