如何查询一对多实体?

时间:2017-03-24 19:10:56

标签: php mysql

在我的系统(PHP / MySql)中,我有一个用户表和图像表。 一个用户可以有很多图像。

我有一个页面需要为每个用户列出所有用户(即使用户没有图像)和所有图像。 我怎么能得到这个?

解决方案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];

有更好的方法来实现这个目标吗?

P.S。 1:使用LEFT JOIN复制结果。

P.S。 2:使用INNER JOIN / JOIN,忽略没有图像的用户。

3 个答案:

答案 0 :(得分:0)

这里,示例(记住内部联接是两个表的交集)

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较慢且不推荐。了解如何在需要时获取数据,我建议您在Web客户端需要时定义REST端点并发出ajax请求并获取数据。

如果您不想错过任何用户,也不想要重复,请参阅以下链接。
更新
我看到你更新的帖子了。这个Link会对你有所帮助。
更确切地说,答案是Left Join Without Duplicate

Two tables, whit one to many relationship. How to join values without duplicate rows?

答案 1 :(得分:0)

SELECT User.* Images.id as images_id, path, size
FROM Images
LEFT JOIN on User user.id = Images.user_id

答案 2 :(得分:0)

以下是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;

会给出这样的结果:来自左表(学生)的所有学生的姓名在表格付款中有或没有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