Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL连接查询,但如果第一个表是重复的,则不显示结果_Php_Mysql - Fatal编程技术网

Php MySQL连接查询,但如果第一个表是重复的,则不显示结果

Php MySQL连接查询,但如果第一个表是重复的,则不显示结果,php,mysql,Php,Mysql,基本上我有两张表: 表1 表2 现在我需要这样的结果: name | table2.id Test 1 2 3 Something 4 5 More 6 因此,第一个表中基本上没有重复的条目。因此,与加入它的结果完全相同,但不会多次显示名称。这在MySQL中是可能的还是应该在PHP中进行过滤?我知道这在PHP中是可能的,但我想知道在MySQL中是否可以实现类似的功能。如果可以,我想

基本上我有两张表:

表1

表2

现在我需要这样的结果:

name      | table2.id
Test        1
            2
            3
Something   4
            5
More        6

因此,第一个表中基本上没有重复的条目。因此,与加入它的结果完全相同,但不会多次显示名称。这在MySQL中是可能的还是应该在PHP中进行过滤?我知道这在PHP中是可能的,但我想知道在MySQL中是否可以实现类似的功能。如果可以,我想知道应该寻找什么。我想用DISTINCT和/或left或right连接来表示查询结果。

这是一个表示查询结果的问题,所以我会选择PHP,它比MySQL更擅长处理这个问题。

这是一个表示查询结果的问题,所以我会选择PHP,哪一个比MySQL更擅长处理此问题。

类似这样的内容:

name      | table2.id
Test        1
            2
            3
Something   4
            5
More        6
选择不同的t1.name、t2.id 从表1作为t1外部右连接表2作为t1.id=t2.table1\U id上的t2

类似这样的内容:

name      | table2.id
Test        1
            2
            3
Something   4
            5
More        6
选择不同的t1.name、t2.id 从表1作为t1外部右连接表2作为t1.id=t2.table1\U id上的t2

你可以试试

select A.name,B.id from table1 A
right join table2 B on A.id=B.table1_id
你可以试着像

select A.name,B.id from table1 A
right join table2 B on A.id=B.table1_id
这个怎么样

SELECT
*, 
(SELECT GROUP_CONCAT(CONCAT(`id`) separator '|') AS table2_ids 
FROM table2 WHERE table1_id = table1.id) AS m
FROM table1
在PHP中,您只需要分解“|”,即$mvar,这是怎么回事

SELECT
*, 
(SELECT GROUP_CONCAT(CONCAT(`id`) separator '|') AS table2_ids 
FROM table2 WHERE table1_id = table1.id) AS m
FROM table1

在PHP中,您只需要分解“|”,即$mvar,因此,您询问MySQL是否可行,我在评论中回答说是的。 如果您的问题是,我如何仅使用MySQL来实现这一点,那么下面是:

SELECT
tmp.name,
tbl2.id
FROM
    tbl2
LEFT JOIN (
SELECT
    tbl2.id AS id,
    tbl1.`name` AS name
FROM
    tbl2
INNER JOIN tbl1 ON tbl1.id = tbl2.tbl1_id
GROUP BY
    tbl2.tbl1_id
) AS tmp ON tbl2.id = tmp.id;
希望这是你想要的


正如@roberto06所建议的,这个查询返回NULL而不是重复的,但是如果您不喜欢NULL并且想要一个空字符串,您可以将SELECT tmp.name更改为SELECT IFNULLtmp.name,

因此,您询问是否可以使用MySQL,我在评论中回答说可以。 如果您的问题是,我如何仅使用MySQL来实现这一点,那么下面是:

SELECT
tmp.name,
tbl2.id
FROM
    tbl2
LEFT JOIN (
SELECT
    tbl2.id AS id,
    tbl1.`name` AS name
FROM
    tbl2
INNER JOIN tbl1 ON tbl1.id = tbl2.tbl1_id
GROUP BY
    tbl2.tbl1_id
) AS tmp ON tbl2.id = tmp.id;
希望这是你想要的

正如@roberto06所建议的,这个查询返回NULL而不是重复的,但是如果您不喜欢NULL并且想要一个空字符串,您可以将SELECT tmp.name更改为SELECT IFNULLtmp.name,

找到它

SELECT (
    SELECT
        IF(COUNT(t2_2.table1_id) = 1, t1.name, '')
        FROM table2 t2_2
        WHERE t2_2.id <= t2.id
            AND t2_2.table1_id = t1.id
    ) AS name,
    t2.id
FROM table1 t1
    LEFT JOIN table2 t2 ON t2.table1_id = t1.id
说明:

这将统计t2_2中table1_id的出现次数,其中t2_2.id小于或等于实际t2.id,而t2_2.table1_id等于t1.id 这将在您的表示例中返回1,2,3,1,2,1 如果计算结果为1,则输出t1.name,否则输出空字符串。 我不知道它是否足够清晰,而且我很确定性能可以提高,但嘿,它可以工作。

找到了

SELECT (
    SELECT
        IF(COUNT(t2_2.table1_id) = 1, t1.name, '')
        FROM table2 t2_2
        WHERE t2_2.id <= t2.id
            AND t2_2.table1_id = t1.id
    ) AS name,
    t2.id
FROM table1 t1
    LEFT JOIN table2 t2 ON t2.table1_id = t1.id
说明:

这将统计t2_2中table1_id的出现次数,其中t2_2.id小于或等于实际t2.id,而t2_2.table1_id等于t1.id 这将在您的表示例中返回1,2,3,1,2,1 如果计算结果为1,则输出t1.name,否则输出空字符串。

我不知道它是否足够清晰,我很确定性能可以提高,但它确实有效。

是的,在MySQLYes中是可能的,在MySQLYes中是可能的,但如果在mysql中是可能的,我认为只在查询中获得它会对性能更好。我认为在SQL中不容易做到,这就是为什么我建议用PHP来做。但是如果在mysql中有可能的话,我认为只在查询中得到它会对性能更好。我认为用SQL来做不容易,这就是为什么我建议用PHP来做。这向我展示了与不使用distinct完全相同的结果,因此它仍然重复t1.nameOK,这在SQL中是不可能的。这向我显示了与不使用distinct完全相同的结果,因此它仍然复制t1.nameOK,那么在SQL中是不可能的。要么我做错了什么,要么这是不对的。我仍然有重复的tbl1。你的表中有重复的吗?是的,没关系。我这边有点不对劲。我把它修好了。它可以工作。这个请求在我的测试数据库上显示空值而不是空值,我建议您在查询的开始处选择IFNULLtmp.name替换SELECT tmp.name@roberto06这是一个很好的建议,但这取决于OP想要实现什么,我不想假设他想要一个空字符串;要么我做错了什么,要么这是不对的。我仍然有重复的tbl1。你的表中有重复的吗?是的,没关系。我这边有点不对劲。我把它修好了。它可以工作。这个请求在我的测试数据库上显示空值而不是空值,我建议您在查询的开始处选择IFNULLtmp.name替换SELECT tmp.name@roberto06这是一个很好的建议,但这取决于OP想要实现什么,我不想假设他想要一个空字符串;