-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSQL.py
More file actions
306 lines (271 loc) · 8.3 KB
/
Copy pathSQL.py
File metadata and controls
306 lines (271 loc) · 8.3 KB
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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
#############################################
# 2018-***** #
#############################################
# SQL for creating the table
sql_create_table_book = "\
CREATE TABLE book(\
book_id INT NOT NULL AUTO_INCREMENT,\
book_title VARCHAR(50),\
author VARCHAR(30),\
PRIMARY KEY (book_id),\
UNIQUE (book_title, author)\
);\
"
# SQL for creating the table
sql_create_table_user = "\
CREATE TABLE user(\
user_id INT NOT NULL AUTO_INCREMENT,\
name VARCHAR(10),\
PRIMARY KEY (user_id)\
);\
"
# SQL for creating the table
sql_create_table_loan = "\
CREATE TABLE loan(\
book_id INT NOT NULL,\
user_id INT NOT NULL,\
PRIMARY KEY (book_id, user_id),\
FOREIGN KEY (book_id) REFERENCES book(book_id) ON DELETE CASCADE,\
FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE\
);\
"
# SQL for creating the table
sql_create_table_rate = "\
CREATE TABLE rate(\
book_id INT NOT NULL,\
user_id INT NOT NULL,\
rate INT NOT NULL,\
PRIMARY KEY (book_id, user_id),\
FOREIGN KEY (book_id) REFERENCES book(book_id) ON DELETE CASCADE,\
FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE,\
CHECK (rate BETWEEN 1 and 5)\
);\
"
# SQL for count # of tables
sql_check_schema_ready = f"""\
SELECT COUNT(*)\
FROM information_schema.tables\
WHERE table_schema = "{"DB2018_10786"}";
"""
# SQL for dropping the table
sql_drop_table_book = 'DROP TABLE book;'
sql_drop_table_user = 'DROP TABLE user;'
sql_drop_table_loan = 'DROP TABLE loan;'
sql_drop_table_rate = 'DROP TABLE rate;'
# SQL for inserting the tuple
sql_insert_into_book_with_id = "\
INSERT INTO book\
VALUES (%s, %s, %s);\
"
# SQL for inserting the tuple
sql_insert_into_user_with_id = "\
INSERT INTO user\
VALUES (%s, %s);\
"
# SQL for inserting the tuple
sql_insert_into_book = "\
INSERT INTO book (book_title, author)\
VALUES (%s, %s);\
"
# SQL for inserting the tuple
sql_insert_into_user = "\
INSERT INTO user (name)\
VALUES (%s);\
"
# SQL for inserting the tuple
sql_insert_into_loan = "\
INSERT INTO loan (book_id, user_id)\
VALUES (%s, %s);\
"
# SQL for inserting the tuple
sql_insert_into_rate = "\
INSERT INTO rate (book_id, user_id, rate)\
VALUES (%s, %s, %s);\
"
# SQL for select all info from book
sql_select_all_info_from_book = "\
SELECT book.book_id, book.book_title, book.author, ROUND(AVG(rate.rate),3) as avg_rate, (1-COUNT(DISTINCT loan.user_id)) as n_avail\
FROM book\
LEFT OUTER JOIN rate ON book.book_id = rate.book_id\
LEFT OUTER JOIN loan ON book.book_id = loan.book_id\
GROUP BY book.book_id\
ORDER BY book.book_id;\
"
# SQL for selecting all info from user
sql_select_all_info_from_user = "\
SELECT user_id, name\
FROM user\
ORDER BY user_id;\
"
# SQL for deletion
sql_delete_from_book = "\
DELETE FROM book\
WHERE book_id = (%s);\
"
# SQL for checking the book with b_id is in DB
sql_check_book_exist = "\
SELECT COUNT(*) as cnt\
FROM book\
WHERE book_id = (%s);\
"
# SQL for count the number of books loaned
sql_count_book_loaned = "\
SELECT COUNT(*) as cnt\
FROM loan\
WHERE loan.book_id = (%s);\
"
# SQL for deletion
sql_delete_from_user = "\
DELETE FROM user\
WHERE user_id = (%s);\
"
# SQL for checking user exists in DB
sql_check_user_exist = "\
SELECT COUNT(*) as cnt\
FROM user\
WHERE user_id = (%s);\
"
# SQL for counting how many books the user loan
sql_count_user_loaned = "\
SELECT COUNT(*) as cnt\
FROM loan\
WHERE loan.user_id = (%s);\
"
# SQL for selecting all information from table <loan>
sql_select_all_info_from_loan = "\
SELECT *\
FROM loan\
ORDER BY book_id, user_id;\
"
# SQL for checking whether the pair exists in loan table or not
sql_check_book_user_exist_in_loan = "\
SELECT COUNT(*) as cnt\
FROM loan\
WHERE book_id = (%s)\
and user_id = (%s);\
"
# SQL for checking whether the pair exists in rate table or not
sql_check_book_user_exist_in_rate = "\
SELECT COUNT(*) as cnt\
FROM rate\
WHERE book_id = (%s)\
and user_id = (%s);\
"
# SQL for update the rate
sql_update_rate = "\
UPDATE rate\
SET rate.rate = (%s)\
WHERE book_id = (%s)\
and user_id = (%s);\
"
# SQL for deletion
sql_delete_from_loan = "\
DELETE FROM loan\
WHERE book_id = (%s)\
and user_id = (%s);\
"
# SQL for selecting borrowing info for the user
sql_select_borrowing_info_for_user = "\
SELECT loan.book_id as id, book.book_title as title, book.author as author\
FROM loan\
JOIN book ON loan.book_id = book.book_id\
WHERE loan.user_id = (%s)\
GROUP BY loan.book_id\
ORDER BY loan.book_id;\
"
# SQL for find the book which contains the query in its title
sql_select_book_with_query = "\
SELECT book.book_id, book.book_title, book.author, ROUND(AVG(rate.rate),3) as avg_rate, (1-COUNT(DISTINCT loan.user_id)) as n_avail\
FROM book\
LEFT OUTER JOIN rate ON book.book_id = rate.book_id\
LEFT OUTER JOIN loan ON book.book_id = loan.book_id\
WHERE book.book_title LIKE CONCAT('%', %s, '%')\
GROUP BY book.book_id\
ORDER BY book.book_id;\
"
# SQL for find the best avg_rate book for the user
sql_recommend_book_with_popularity_rate = "\
SELECT A.book_id, B.book_title, B.author, B.avg_rate, B.n_avail\
FROM (\
SELECT book.book_id\
FROM book\
WHERE NOT EXISTS (\
SELECT rate.book_id\
FROM rate\
WHERE rate.user_id = (%s)\
AND book.book_id = rate.book_id)\
) AS A,(\
SELECT book.book_id, book.book_title, book.author, ROUND(AVG(rate.rate),3) AS avg_rate, (1-COUNT(DISTINCT loan.user_id)) as n_avail\
FROM book\
LEFT OUTER JOIN rate ON book.book_id = rate.book_id\
LEFT OUTER JOIN loan ON book.book_id = loan.book_id\
GROUP BY book.book_id\
ORDER BY book.book_id\
) AS B\
WHERE A.book_id = B.book_id\
ORDER BY B.avg_rate desc, A.book_id\
LIMIT 1;\
"
# SQL for find the most # of rates book for the user
sql_recommend_book_with_popularity_num = "\
SELECT C.book_id, C.book_title, C.author, C.avg_rate, C.n_avail\
FROM (\
SELECT A.book_id, B.book_title, B.author, B.avg_rate, B.n_avail, B.num_rate\
FROM (\
SELECT book.book_id\
FROM book\
WHERE NOT EXISTS (\
SELECT rate.book_id\
FROM rate\
WHERE rate.user_id = (%s)\
AND book.book_id = rate.book_id)\
) AS A,(\
SELECT book.book_id, book.book_title, book.author, ROUND(AVG(rate.rate),3) AS avg_rate, COUNT(rate.rate) AS num_rate, (1-COUNT(DISTINCT loan.user_id)) as n_avail\
FROM book\
LEFT OUTER JOIN rate ON book.book_id = rate.book_id\
LEFT OUTER JOIN loan ON book.book_id = loan.book_id\
GROUP BY book.book_id\
ORDER BY book.book_id\
) AS B\
WHERE A.book_id = B.book_id\
ORDER BY B.num_rate desc, A.book_id\
LIMIT 1\
) AS C\
"
# SQL for selecting all user ids
sql_select_all_ids_from_user = "\
SELECT user_id\
FROM user\
ORDER BY user_id;\
"
# SQL for selecting all book ids
sql_select_all_ids_from_book = "\
SELECT book_id\
FROM book\
ORDER BY book_id;\
"
# SQL for selecting all rate info
sql_select_all_info_from_rate = "\
SELECT user_id, book_id, rate\
FROM rate\
ORDER BY user_id, book_id;\
"
# SQL for selecting info about a specific book (w/ quantity)
sql_select_info_from_book = "\
SELECT book.book_id, book.book_title, book.author, ROUND(AVG(rate.rate),3) as avg_rate, (1-COUNT(DISTINCT loan.user_id)) as n_avail\
FROM book\
LEFT OUTER JOIN rate ON book.book_id = rate.book_id\
LEFT OUTER JOIN loan ON book.book_id = loan.book_id\
WHERE book.book_id = (%s)\
GROUP BY book.book_id\
ORDER BY book.book_id;\
"
# SQL for selecting info about a specific book (w/o quantity)
sql_select_info_from_book_recommend = "\
SELECT book.book_id, book.book_title, book.author, ROUND(AVG(rate.rate),3) as avg_rate\
FROM book\
LEFT OUTER JOIN rate ON book.book_id = rate.book_id\
WHERE book.book_id = (%s)\
GROUP BY book.book_id\
ORDER BY book.book_id;\
"