簡體   English   中英

uksort help - 在單個需要幫助時使用 GROUP BY

[英]uksort help - using GROUP BY in single need help

你好,我有一個數組,通過uksort()后看起來像這樣

    Array
(
    [3] => Array
        (
            [job_id] => 4
            [job_title] => Supercar Test Driver
            [company_name] => McLaren
            [logo_small] => small_mclaren001.png
            [logo_large] => large_mclaren002.png
            [employer_id] => 3
        )

    [2] => Array
        (
            [job_id] => 3
            [job_title] => Recruitment Consultant - Driving
            [company_name] => MoovJob.com
            [logo_small] => small_rac001.png
            [logo_large] => large_rac002.png
            [employer_id] => 2
        )

    [1] => Array
        (
            [job_id] => 5
            [job_title] => Postal Worker / Post Person
            [company_name] => Royal Mail
            [logo_small] => small_royalmail001.png
            [logo_large] => large_royalmail002.png
            [employer_id] => 4
        )

    [0] => Array
        (
            [job_id] => 6
            [job_title] => Another Job
            [company_name] => MoovJob.com
            [logo_small] => small_rac001.png
            [logo_large] => large_rac002.png
            [employer_id] => 2
        )

)

但是,如果在返回此數組的 SQL 中,我添加 GROUP BY company_name 數組中的最終條目消失,我想要實現的是將職位名稱放在公司名稱下,但只顯示公司名稱一次,類似於這個,

公司名稱 1
職稱 1 職稱 2 職稱 3

公司名稱 2
職稱 4

公司名稱
職位名稱 5 職位名稱 6

我試圖通過在我看來執行以下操作來實現這一點,但是我只能顯示一個空缺,我做錯了什么?

    <?php $oldemp   = "";?>
<?php foreach($jobs as $key => $value) : ?>
   <?php if ($oldemp != $value['company_name']) : ?>
        <?php $oldemp = $value['company_name']; ?>
        <section class="employer">
            <div class="job_holder">
                <img src="<?php echo base_url(); ?>media/uploads/users/<?php echo $value['logo_large']; ?>" width="198" height="148" alt="<?php echo $value['company_name']; ?>"/>
                <dl>
                    <dt><?php echo count($key); ?></dt>
                    <dd>Matches</dd>
                </dl>
    <?php endif;?>
            <span> + <a href="/jobwall/getjob/<?php echo $value['job_id']; ?>"><?php echo $value['job_title']; ?></a></span>
            </div>
        </section>
<?php endforeach; ?>


    function jobcmp($job1, $job2)
    {
        return strcmp($job1['company_name'], $job2['company_name']);
    }

盡管可以使用您的方法顯示數據,但我通常發現以更方便的格式創建第二個數組要簡單得多:

$groupedJobs = array();
foreach ($jobs as $data) {
    if (!isset($groupedJobs[$data['company_name']])) {
        $groupedJobs[$data['company_name']] = array();
    }
    $groupedJobs[$data['company_name']][] = $data;
}

這將使用公司名稱作為鍵創建一個新數組,並將嵌套數組中該公司的工作作為值,為您提供如下內容:

['MoovJob.com'] => Array
    (
        [0] => Array
            (
                (job data)
            ),
        [1] => Array 
            (
                (etc.)
            )
    ),
['McLaren'] = Array
    (
        (etc)
    )

然后更容易遍歷這個數組並顯示:

foreach ($groupedJobs as $companyName => $jobs) {
    echo $companyName;
    foreach ($jobs as $job) {
        echo $job['job_title'].'<br />';
    }
}

看起來數組是按job_title DESC排序的,而它應該按company_name排序

您的數組未正確排序,具有相同 id 的員工應該是一個接一個,對於這個數組,您應該使用這樣的 usort 方法

usort($jobs, function($a, $b) {
 if($a['employee_id'] == $b['employee_id'] return 0;
 return ($a['employee_id'] < $b['employee_id']) ? 1 : -1;
})

另一種方法,我認為更適合您的目的是使用 array_walk 為本節循環准備數據。 下面的方法將從表中刪除重復項,並將同一員工的所有 job_titles 連接到主要員工記錄中的一個鍵中。

array_walk($jobs, function($emp, $index) use(&jobs) {
  static $primary;

  if(isset($primary[$emp['employee_id']) {
    $jobs[$primary[$emp['employee_id']]]['job_titles'][$emp['job_id'] = $emp['job_title'];
    unset($jobs[$index]);
  } else {
    $primary[$emp['employee_id']] = $index; //remeber index of primary entry
  }
});

如果您顯示 SQL 查詢,將會有所幫助。 但是,消失的行顯然與您添加的GROUP BY company_name有關。

當您添加GROUP BY groupfield時,具有相同groupfield的所有行“折疊”成一行。 依賴於該字段的列,如company_logo通常可以安全地保留在SELECT列表中。 所有其他人都應刪除或更改為使用聚合 function ,如SUM()COUNT()

因此,如果您想顯示每家公司的職位數量,請使用COUNT(job_id)COUNT(*)

就您而言,我認為您有兩種選擇。

  • 第一個選項是不使用GROUP BY ,也許只使用ORDER BY並使用 PHP 代碼來顯示您需要的內容。

  • 第二個選項是使用GROUP BY和聚合GROUP_CONCAT() function。

你可以像這樣使用它:

SELECT
    company_name
  , GROUP_CONCAT( job_id
                  ORDER BY job_id
                  SEPARATOR ', ' )
      AS job_ids
  , GROUP_CONCAT( job_title
                  ORDER BY job_id
                  SEPARATOR ', ' )
      AS job_titles
  , GROUP_CONCAT( CONCAT(job_id, '-', job_title)
                  ORDER BY job_id
                  SEPARATOR ', ' )
      AS job_ids_and_titles
  , company_name
  , logo_small
  , logo_large
  , employer_id
FROM 
  ...
GROUP BY company_name

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM