[英]How to query One-to-Many entities?
在我的系統(PHP / MySql)中,我有一個User表和Images表。 一個用戶可以擁有許多圖像。
我有一個頁面,其中需要列出每個用戶的所有用戶(即使用戶沒有圖像)和所有圖像。 我怎么能得到這個?
解決方案1
$users = query('SELECT * FROM Users')
然后
foreach($users as $user) $user->images = query('SELECT id, path, size FROM Images WHERE user_id = ' . $user->id)
解決方案2
$ users = query('SELECT *,(SELECT GROUP_CONCAT(id,path,size)FROM Images)作為來自用戶的圖像')
然后
foreach($users as $user) list($id,$path, $size) = explode(',', $user->images) $user['images'] = ['id' => $id, 'path' => $path, 'size' => $size];
有更好的方法來完成此操作嗎?
PS 1:使用LEFT JOIN復制結果。
PS 2:使用INNER JOIN / JOIN,沒有圖像的用戶將被忽略。
在這里,是示例(記住內部聯接是兩個表的交集)
SELECT
Users.id as user_id,
Images.id as image_id,
Images.path,
Images.size
FROM
Users
INNER JOIN Images ON Users.id = Images.user_id
如果要使用INNER JOIN,但是請記住,對於大量數據,JOIN速度較慢,不建議使用。 了解如何在需要時獲取數據,我建議定義REST端點並進行Ajax請求並在需要Web客戶端時獲取數據。
如果您不想錯過任何用戶,也不想重復,請參見以下鏈接。
更新:
我看到了您更新的帖子。 此鏈接將為您提供幫助。
更確切地說,這里的答案左連接不重復
SELECT User.* Images.id as images_id, path, size
FROM Images
LEFT JOIN on User user.id = Images.user_id
這是2表上所有的可能性查詢,學生和付款。
Tables: students payment
id_student name id id_student datepayment
1 Lisa 1 1 2017-01-01
2 2 1 2017-02-03
3 Asher 3 2 2017-03-05
4 Lee 4 1 2017-03-03
該查詢:
select students.name, payment.datepayment
FROM students, payment
where students.id_student = payment.id_student;
將給出此結果-表付款中具有id_student的所有學生的姓名
name datepayment
Lisa 2017-01-01
Lisa 2017-02-03
Lisa 2017-03-03
2017-03-05
該查詢:
SELECT s.name, p.datepayment
FROM
students s
LEFT OUTER JOIN payment p ON s.id_student = p.id_student;
將得到以下結果:LEFT表(學生)中所有在表付款中有或沒有id_student的學生的姓名
name datepayment
Lisa 2017-01-01
Lisa 2017-02-03
2017-03-05
Lisa 2017-03-03
Asher NULL
Lee NULL
該查詢:
SELECT s.name, p.datepayment
FROM
students s
RIGHT OUTER JOIN payment p ON s.id_student = p.id_student;
會給出此結果-全部來自RIGHT表格付款,僅來自在表格付款中具有id_student的學生姓名
name datepayment
Lisa 2017-01-01
Lisa 2017-02-03
2017-03-05
Lisa 2017-03-03
該查詢:
SELECT s.name, p.datepayment
FROM
students s
INNER JOIN payment p ON s.id_student = p.id_student;
將給出此結果-表付款中具有id_student的所有學生的姓名
name datepayment
Lisa 2017-01-01
Lisa 2017-02-03
Lisa 2017-03-03
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.