2012-12-03 49 views
1

目前,我正在爲我的框架腳手架編寫一個模型系統。但是,我的SQL技能並不是那麼好。目前,我的系統正在產生這個查詢。SQL加入和限制

SELECT 
`User`.`id` AS `User_id`, 
`User`.`name` AS `User_name`, 
`Address`.`id` AS `Address_id`, 
`Address`.`address` AS `Address_address`, 
`Address`.`user_id` AS `Address_user_id`, 
`Database`.`id` AS `Database_id`, 
`Database`.`user_id` AS `Database_user_id` 
FROM 
`users` AS `User`, 
`addresses` AS `Address`, 
`databases` AS `Database` 
GROUP BY `User_id`,`Address_id`,`Database_id` 
HAVING 
`User`.`id` = 1 AND 
`Address`.`user_id` = `User`.`id` AND 
`Database`.`user_id` = `User`.`id`; 

產生這種結果。

User_id User_name Address_id Address_address Address_user_id Database_id Database_user_id 
======= ========= ========== =============== =============== =========== ================ 
1   Nat   1    1234    1     1    1 
1   Nat   1    1234    1     2    1 
1   Nat   2    3456    1     1    1 
1   Nat   2    3456    1     2    1 

這工作正常,但我知道我可能不這樣做的最佳方式(我也許應該利用真實的連接?),這讓我可以從這裏極其有限的做。

例如,如果我想限制爲一個地址(對於oneToOne關係),而不影響oneToMany數據庫關係。我如何修改這個SQL來做到這一點?

這是最好的想法甚至可以做一個查詢嗎?

+0

根據我對你的結構的理解,'User'可能有很多'Address',但你只想顯示最多1個? – Matthew

+0

是的,但仍顯示所有的數據庫行。 – Nathaniel

回答

1

無需組當前的查詢:

SELECT 
    `User`.`id` AS `User_id`, `User`.`name` AS `User_name`, 
    `Address`.`id` AS `Address_id`, `Address`.`address` AS `Address_address`, `Address`.`user_id` AS `Address_user_id`, 
    `Database`.`id` AS `Database_id`, `Database`.`user_id` AS `Database_user_id` 
FROM `users` AS `User`, 
    JOIN `addresses` AS `Address` ON `Address`.`user_id` = `User`.`id` 
    JOIN `databases` AS `Database` ON `Database`.`user_id` = `User`.`id` 
WHERE `User`.`id` = 1; 

得到的只是一個用戶的記錄,你需要找到一種方法,無論是在邏輯上限制你獲取你的地址&數據庫記錄(使用MAX或其他聚合函數)的基礎上應用程序的需求,否則只是組Concat的供日後分析您的應用程序,如:

SELECT 
    `User`.`id` AS `User_id`, `User`.`name` AS `User_name`, 
    GROUP_CONCAT(CONCAT(`Address`.`id`, ',', `Address`.`address`, ',', `Address`.`user_id`) SEPARATOR '|') AS `Addresses` 
    GROUP_CONCAT(CONCAT(`Database`.`id`, ',', `Database`.`user_id`) SEPARATOR '|') AS `Databases` 
FROM `users` AS `User`, 
    JOIN `addresses` AS `Address` ON `Address`.`user_id` = `User`.`id` 
    JOIN `databases` AS `Database` ON `Database`.`user_id` = `User`.`id` 
WHERE `User`.`id` = 1 
GROUP BY `User`.`id`; 

的GROUP_CONCAT的注意限制(1024個字符默認,但可配置)......使用它只是例如。

編輯:另一點你應該從上面的例子中不要使用HAVING子句,你可以使用WHERE子句來做同樣的事情。在哪裏顯着更快。只能使用HAVING子句來測試集合操作的結果。

+1

爲什麼'HAVING'而不是'WHERE'? –

+0

這是從OP剩餘的。在我的第一篇文章後改了幾秒。 –