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