簡體   English   中英

如何查詢一對多實體?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM