2013-10-30 69 views
0

我想從我的數據庫中提取幾張表並將它們合併爲一個結果查詢。有條件地用SELECT填充列

我有一個products表:

+-----------------+-----------------------------+------+-----+---------+----------------+ 
| Field   | Type      | Null | Key | Default | Extra   | 
+-----------------+-----------------------------+------+-----+---------+----------------+ 
| id    | bigint(20)     | NO | PRI | NULL | auto_increment | 
| menu_id   | bigint(20)     | YES |  | NULL |    | 
| menu_is_section | int(1)      | NO |  | 1  |    | 
| company_id  | bigint(20)     | NO | MUL | NULL |    | 
| name   | varchar(255)    | NO |  | NULL |    | 
| description  | mediumtext     | YES |  | NULL |    | 
| image   | varchar(255)    | NO |  | NULL |    | 
| initial_time | datetime     | YES |  | NULL |    | 
| final_time  | datetime     | YES |  | NULL |    | 
| archived  | int(1)      | NO |  | 0  |    | 
| full_image  | varchar(255)    | YES |  | NULL |    | 
| kind   | enum('PRODUCT','PROMOTION') | NO |  | PRODUCT |    | 
+-----------------+-----------------------------+------+-----+---------+----------------+ 

一個product_likes表:

+------------+------------+------+-----+-------------------+-----------------------------+ 
| Field  | Type  | Null | Key | Default   | Extra      | 
+------------+------------+------+-----+-------------------+-----------------------------+ 
| user_id | bigint(20) | NO | MUL | NULL    |        | 
| product_id | bigint(20) | NO | MUL | NULL    |        | 
| liked_on | timestamp | NO |  | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | 
+------------+------------+------+-----+-------------------+-----------------------------+ 

而一個users表我想下獲取所有的產品,其唯一的相關領域是id

一個菜單並確定用戶是否「喜歡」該產品。爲此,我正在考慮創建一個新的列來創建一個新列,該列將創建包含1或0的列「likes」,以查看用戶是否喜歡某個產品。

但我有點卡住了,因爲我無法找到有條件地用MySQL填充列的方式。

我的查詢到目前爲止是這樣的:

"SELECT id, name, description, concat('$image_base_url/products/', image) AS icon, concat('$image_base_url/products_full/', full_image) AS full_image FROM (SELECT * FROM products WHERE menu_id = ? AND menu_is_section = ?) AS selected WHERE UTC_TIMESTAMP() BETWEEN initial_time AND final_time ORDER BY initial_time DESC"

而且一切,我需要完成它是尋找如果USER_ID喜歡一個product_it,並創建相應的列。

這樣做的最好方法是什麼?

編輯:

我只是做了LEFT JOIN,我想我越來越接近我想要的東西。 「喜歡」返回1,但我99%肯定這是因爲user_id是1.當用戶不喜歡產品時,它返回NULL。我可以用這個工作,但是如果我的web服務器返回1和0,會更好。

"SELECT selected.id, u_likes.user_id AS liked, selected.name, selected.description, concat('$image_base_url/products/', selected.image) AS icon, concat('$image_base_url/products_full/', selected.full_image) AS full_image FROM (SELECT * FROM products WHERE menu_id = ? AND menu_is_section = ?) AS selected LEFT JOIN (SELECT * FROM product_likes WHERE user_id = ?) AS u_likes ON selected.id = u_likes.product_id WHERE UTC_TIMESTAMP() BETWEEN selected.initial_time AND selected.final_time ORDER BY selected.initial_time DESC"

回答

0

我相信我已經想通了。如果有任何專家在這裏,請查看我的解決方案:

SELECT selected.id, CASE WHEN u_likes.user_id IS NULL THEN '0' ELSE '1' END AS liked, selected.name, selected.description, concat('$image_base_url/products/', selected.image) AS icon, concat('$image_base_url/products_full/', selected.full_image) AS full_image FROM (SELECT * FROM products WHERE menu_id = ? AND menu_is_section = ?) AS selected LEFT JOIN (SELECT * FROM product_likes WHERE user_id = ?) AS u_likes ON selected.id = u_likes.product_id WHERE UTC_TIMESTAMP() BETWEEN selected.initial_time AND selected.final_time ORDER BY selected.initial_time DESC

這似乎是適當的把1或0在一個名爲場「喜歡」。可悲的是我現在不能做很多測試用例,但看起來它工作正常。