【问题标题】:PHP VLookup (conditional match) Alternative?PHP VLookup(条件匹配)替代方案?
【发布时间】:2010-11-12 09:06:57
【问题描述】:

如何返回 provision_id 列的结果,以便它们以每行的contracts.id 为条件?现在,我在每一行都得到相同的结果。想要的效果有点像 Excel 中的 VLookup。不知道如何使用 if else/sql 值在 PHP 中实现它。

相关代码:

<?php
global $wpdb;
$contents = $wpdb->get_results( $wpdb->prepare("SELECT id, name, remaining, contract_value FROM salaries"));
$contracts = $wpdb->get_results( $wpdb->prepare("SELECT contracts.id,source,provision,provision_id FROM contracts LEFT JOIN salaries ON contracts.id = salaries.id"));

 ?>

   [table header stuff...]

foreach ($contents as $content) {
    ?>   
         <tr>
                <td><?php echo $content->name ?></td>
                <td><?php echo $content->remaining ?></td>
                <td><?php echo $content->contract_value ?></td>
                <td><?php foreach ($contracts as $contract) { echo $contract->provision_id }; ?> 
               </td>

电流输出

Name               Remaining         Contract_Value    Provision_ID
--------------     ---------------   --------------    --------------
Adam               100               300               A1 B1 C1
Bill               200               400               A1 B1 C1
Chad               200               400               A1 B1 C1

期望的输出

Name               Remaining         Contract_Value    Provision_ID
--------------     ---------------   --------------    --------------
Adam               100               300               A1
Bill               200               400               B1
Chad               200               400               C1

其中 A1、B1、C1 分别代表一个存储的数据单元格,该单元格对应于 column1 中的人员姓名。我正在尝试根据 Adam、Bill 和 Chad 的 ID 而不是名称来设置 provision_id,但我不希望 ID 显示在 php 输出中。

本质上,我希望 PHP “查找” ID(也称为成员 ID)并打印相应的 provision_id。在这种情况下,连接表格可能不起作用,因为我还从表格中拉出“工具提示”作为 A1、B1、C1 等的鼠标悬停效果。

附录 1 - 也就是正在发生的事情。我没有解释(为了保持简单)亚当比尔和乍得每个人都有不止一个供应 ID。 Adam 有供应 ID:例如 A1、A2 和 A3。我试图避免下面的问题(GROUP_CONCAT 可以工作,但我不认为它可以工作,因为我对每个条款都有一个鼠标悬停工具提示)。

Name               Remaining         Contract_Value    Provision_ID
--------------     ---------------   --------------    --------------
Adam               100               300               A1
Adam               100               300               A2
Adam               100               300               A3
Bill               200               400               B1
Bill               200               400               B2
Chad               200               400               C1

【问题讨论】:

  • 我不明白你想要达到什么目的。你能解释一下这些行的外观吗?
  • 我更新了问题以显示我想要实现的目标。

标签: php mysql conditional


【解决方案1】:

尝试以下查询。然后,您只需向数据库发出一次请求即可完成所有操作。

SELECT salaries.id AS salaries_id, salaries.name, salaries.remaining, 
salaries.contract_value, contracts.provision_id AS provision_id 
FROM salaries LEFT JOIN contracts ON contracts.id=salaries.id

【讨论】:

  • 尽管我遗漏了一件重要的事情,但你已经死心了。 Provision_id 是一个空字段,其中一些人还没有合同条款。此查询没有返回那些没有规定的人。虽然我正在学习,但可能有一个有条件的空解决方法,所以如果你知道如何调整,请告诉我。与此同时,我会寻找答案。谢谢!
  • 或者我的意思是说它只拉动在两个表中都有 id 的人。在这一点上,合同表非常不完整。
  • 我刚刚编辑了 SQL 以使其成为 LEFT JOIN,就像您在原始问题中所做的那样。这应该得到薪水表中的所有条目。
  • 很抱歉。我想我花了这么多时间后变得神志不清。我有每个人的多个合同provision_ids,每个id 代表合同中的一个条款。每个条款在合同表中都有自己的行。我之前说你是对的时我错了,因为该解决方案会为每个拥有多个条款的人打印重复的行。我已经用附录 1 编辑了我的问题,以显示现在正在发生的事情。
  • 我现在把所有东西都放到网上了:beerlyrics.com/jimmy-jones 试图把 1,2 放到 JD Drew 的行中。现在你可以看到我真正在做什么了:/
【解决方案2】:

由于我仍在自学,因此不得不为此寻求专业帮助。他使用了一种称为条件简写的技术,使得 $contracts 查询只对两个表之间 'id' 匹配的行起作用。

中奖码sn-p:

     foreach ($contracts as $contract)
                    {
                        echo ( $content->id == $contract->id ) ?
                             '<a href="' . $contract->source . '" tooltip="' . $contract->provision . '">' . $contract->provision_id . " " . '</a>' : '';
                     } 
                   ?>
                </td>

<?php };

他给我发了这个链接:http://www.bradino.com/php/ternary-operator-conditional/ 你可以在http://travisballard.com/找到他。

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多