繁体   English   中英

在 php MySQL 中用 LEFT JOIN 重复查询结果

[英]Repeat results query with LEFT JOIN in php MySQL

我尝试使用 LEFT JOIN 从 3 个表中获取数据。 当我保存这个主题的图像时,一个表(图像表)中的问题,例如每个主题在该表中有 4 个图像,所以现在当我查询以获取这些数据时,结果每次重复 4 次重复了 2 个其他表,但图片在每个查询中都在变化,最后我得到 4 个结果。 我该如何解决这个问题? 我需要 4 张图像,但不需要 4 次查询。

正如您将在我的表格示例中看到的那样,主题 ID 1 有 4 张图片:

table-1 : topic 
+-------+-----------+-----------+-------------------+
|   id  |   name    |    time   |       data        |
+-------+-----------+-----------+-------------------+
|   1   |   John    |     1     |   214-444-1234    |
|   2   |   Mary    |     1     |   555-111-1234    |
|   3   |   Jeff    |     1     |   214-222-1234    |
|   4   |   Bill    |     1     |   817-333-1234    |
|   5   |   Bob     |     1     |   214-555-1234    |
+-------+-----------+-----------+-------------------+


table-2 : image
+-------+-----------+-----------+-------------+
|   id  |   name    |   image   | Id_Topic    |
+-------+-----------+-----------+-------------+
|   1   |   John    |     png   |   1         |
|   2   |   Mary    |     png   |   1         |
|   3   |   Jeff    |     png   |   1         |
|   4   |   Bill    |     png   |   1         |
|   5   |   Bob     |     png   |   5         |
+-------+-----------+-----------+-------------+

table-3 : others
+-------+-----------+-----------+-------------------+
|   id  |   name    |   city    |       phone       |
+-------+-----------+-----------+-------------------+
|   1   |   John    |     Uk    |   214-444-1234    |
|   2   |   Mary    |     Uk    |   555-111-1234    |
|   3   |   Jeff    |     Uk    |   214-222-1234    |
|   4   |   Bill    |     Uk    |   817-333-1234    |
|   5   |   Bob     |     Uk    |   214-555-1234    |
+-------+-----------+-----------+-------------------+

我的查询如:

SELECT * FROM topics
  LEFT JOIN image ON topics.id = image.Id_Topic 
  inner join Others ON topics.id = Others .id
  where topics.id = ?

MySQL GROUP_CONCAT是否满足您的需求?

SELECT topic.name, images.images
FROM topic
JOIN (
  SELECT id_Topic, GROUP_CONCAT(DISTINCT image) images
  FROM image GROUP BY id_Topic
) images ON topic.id = images.id_Topic
;

输出:

| name | images              |
|------|---------------------|
| John | 1png,2png,3png,4png |
| Bob  | 5png                |

如您所见, GROUP_CONCAT使用逗号连接多个图像链接,因此要显示每个图像,您需要使用后端编程语言以逗号分隔images字符串,然后循环生成的数组并单独显示每个图像。

如果您有 PHP,则explode()循环可能如下所示:

<?php

// get images string from database: $images_str
// ...

$images_arr = explode($images_str, ',');
foreach ( $images_arr as $image ) {
  echo <<<IMG
    <img src="$image">
IMG;
}

?>

上面的示例,主题名称“John”,输出:

    <img src="1png">
    <img src="2png">
    <img src="3png">
    <img src="4png">

-- create
CREATE TABLE topic (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL
);

CREATE TABLE image (
  id INTEGER PRIMARY KEY,
  id_Topic INTEGER,
  image TEXT NOT NULL,
  name TEXT NOT NULL
);

-- insert
INSERT INTO topic VALUES (1, 'John'), (2, 'Mary'), (3, 'Jeff'), (4, 'Bill'), (5, 'Bob');
INSERT INTO image VALUES (1, 1, '1png', 'John'), (2, 1, '2png', 'Mary'), (3, 1, '3png', 'Jeff'), (4, 1, '4png', 'Bill'), (5, 5, '5png', 'Bob');

-- fetch 
SELECT topic.name, images.images
FROM topic
JOIN (
  SELECT id_Topic, GROUP_CONCAT(DISTINCT image) images
  FROM image GROUP BY id_Topic
) images ON topic.id = images.id_Topic
;

在这里试试: https://onecompiler.com/mysql/3yhasjhut

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM