【问题标题】:Distinct left table rows on a left join左连接上的不同左表行
【发布时间】:2014-03-03 15:44:50
【问题描述】:

我需要区分左连接上的左表行。

不是这个

|  name  |  last name  |  phone  |
|--------|-------------|---------|
|  name1 |  lastname1  | 1234567 |
|--------|-------------|---------|
|  name1 |  lastname1  | 2345678 |
|--------|-------------|---------|
|  name2 |  lastname2  | 3456789 |

我需要这个

|  name  |  last name  |  phone  |
|--------|-------------|---------|
|  name1 |  lastname1  | 1234567 |
|        |             | 2345678 |
|--------|-------------|---------|
|  name2 |  lastname2  | 3456789 |

我尝试了 SELECT DISTINCT 但没有成功... 我也尝试了 GROUP BY,但它隐藏了第二行

【问题讨论】:

  • 使用 group_concat 试试这个 SELECT name, lastname, GROUP_CONCAT(phone,' ') FROM table GROUP BY name
  • 添加了mysql标签作为问题标题包括mysql

标签: mysql sql left-join


【解决方案1】:

Mariano,从您关闭的 WP 帖子中关注您。

<?php
$results = your_sql_query_here();
$data = array();

foreach( $results as $result ) {
    // Make a new array node for each name
    if ( ! isset( $data[$result['name']] )
        $data[$result['name']] = array();

    $data[$result['name']][] = $result['phone'];
}

这会给你这样的东西

Array(
    ['name1'] => Array(
        [0] => 5123451,
        [1] => 5123452
    ),
    ['name2'] => Array(
        [0] => 5123453,
        [1] => 5123454
    ) )

然后,您可以对 $data 数组执行 for 循环,将键用作您的 name1 值。

或者存储整个数据集

<?php
$results = your_sql_query_here();
$data = array();

foreach( $results as $result ) {
    // Make a new array node for each name
    if ( ! isset( $data[$result['name']] )
        $data[$result['name']] = array();

    $data[$result['name']][] = $result;
}

现在您可以访问所有节点,但按name 分组。

Array(
    ['name1'] => Array(
        [0] => Array( 'name' => 'name1', 'phone' => 4165123, 'another_field' => 1 ),
        [1] => Array( 'name' => 'name1', 'phone' => 4165157, 'another_field' => 0 ),
        [1] => Array( 'name' => 'name1', 'phone' => 4225157, 'another_field' => 0 )
    ),
    ['name2'] => Array(
        [0] => Array( 'name' => 'name2', 'phone' => 4165123, 'another_field' => 1 ),
        [1] => Array( 'name' => 'name2', 'phone' => 4572321, 'another_field' => 1 ),
        [1] => Array( 'name' => 'name2', 'phone' => 5235157, 'another_field' => 0 )
    ) )

【讨论】:

  • 嗨,埃里克,感谢您关注我。问题是,这个系统会保留字段内的关联吗?因为我有更多的列,并且大多数字段都可以保留为 NULL...现在,我应该能够将电话号码与同一行的其他字段一起保存,然后打印出来。另一种选择是放弃左连接方法并使用更多的查询过滤外键......
  • 嗯,您总是可以存储整个条目而不是特定字段。我将在答案中举出另一个例子。
  • 谢谢,我们已经接近重点了。当我收到一些错误时,我已经更正了您的代码,这是 var_dump:pastebin.com/B8GnDi9N,您可以看到我已按 id 而不是名称对它们进行分组。只对电话号码进行分组不是更好吗?提供这样的示例:pastebin.com/iuycEm56。如果没有,我将考虑如何仅打印非重复元素,但如果您有任何建议,请告知。多谢!! PS,如果您认为这更好,我会提出一个新问题
【解决方案2】:

你需要GROUP_CONCAT

此函数返回一个字符串结果,其中包含来自组的连接的非 NULL 值。

因此,您的代码将是:

  SELECT name, 
         last_name, 
         GROUP_CONCAT(phone) AS phones
    FROM table1
GROUP BY name, last_name;

【讨论】:

  • 不错的解决方案,但在实际情况下,我有更多的列...如果我将它们全部分组,那么我无法在通过 php 打印时关联回正确的值,因为某些字段可能为空...
【解决方案3】:

使用GROUP_CONCAT(),但要注意它的字符长度限制为默认1024,但可以增加

SELECT name, 
last_name, 
GROUP_CONCAT(DISTINCT phone SEPARATOR ' ')
FROM table1 
GROUP BY name, last_name

See fiddle Demo

【讨论】:

  • 感谢小提琴 Khalid,不幸的是,这对我不利,正如我向亚历山大解释的那样......如果我这样做,我会失去字段关联,因为我有一些字段可以为空
  • @Mariano 你能用示例数据集在 sqlfiddle 中发布你的表的模式,并用所需的结果集更新你的问题
  • Khalid,我应该发布整个数据库方案给你真实的情况,你确定你需要这个吗?
  • @Mariano 不是整个数据库架构,只有所需的表架构和示例数据集
  • 嗨,Khalid,我目前正在关注 Eric 的解决方案。这是一个解决方案 PHP 方面。如果您对此有任何意见,我将很高兴听到它。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
相关资源
最近更新 更多