在JOIN 2表

时间:2016-10-07 10:52:18

标签: mysql sql

我在查询中做出的SUM有问题,如下所示:

修改 我用英语发布我的查询,所以每个人都明白我想说的话:

    $sql = "SELECT 
       c.stock,
       c.id as cid,
       cb.course as ccourse,
       cb.price_member as cbprice_member,
       cb.price_not_member as cbprice_not_member,
       cb.study as cbstudy,
       cb.studentid,


          (SELECT 
              SUM(CASE WHEN c.stock > 0 THEN price_member ELSE 0 END) AS subtotal_member,
              c.stock 
           FROM 
              courses_orders cb
           JOIN 
              courses c 
           ON 
              cb.course_id = c.id 
           WHERE 
              cb.date_removed IS NULL AND 
              cb.date_order_mail IS NOT NULL AND
              cb.date_pickup IS NULL AND 
              cb.date_pickup_mail IS NULL AND 
              cb.studentid = '$studentid' AND 
              cb.course_id = '$cid' AND 
              c.stock > 0
          ) as subtotal_member,


       (SELECT SUM(price_not_member) FROM courses_orders WHERE date_removed IS NULL AND date_order_mail IS NOT NULL AND date_pickup IS NULL AND date_pickup_mail IS NULL AND studentid = '$studentid' AND course_id = '$cid') as subtotal_not_member
     FROM 
       courses c
     JOIN
       courses_orders cb
     ON
       cb.course_id = c.id
     WHERE 
       c.id = '$cid' AND cb.date_removed IS NULL AND cb.date_pickup IS NOT NULL AND cb.date_pickup_mail IS NULL AND cb.studentid = '$studentid'
     ";

所以,问题是SUM(CASE WHEN c.stock> 0 THEN price_member ELSE 0 END)AS subtotal_member 我有两次subtotal_member。我认为这也不正确。 如果我设置cb.price_member我有错误:操作数应该包含1列,如果我设置price_member(之前没有cb。)我有错误:price_member是不明确的。 我想在这里做的是让所有商品的总价格没有库存低于1的价格。所以我在这里c.voorraad> 0但结果始终是所有项目的总价格,而不仅仅是库存高于0的那些。

这是原始查询(带有荷兰项),它与上面的查询具有不同的字段相同。如果您已阅读EN版本,请忽略此项。

         $sql = "SELECT 
               c.voorraad,
               c.id as cid,
               cb.artikel as cbartikel,
               cb.prijs_lid as cbprijs_lid,
               cb.prijs_niet_lid as cbprijs_niet_lid,
               cb.studierichting as cbstudierichting,
               cb.studentid,


                  (SELECT 
                      SUM(CASE WHEN c.voorraad > 0 THEN prijs_lid ELSE 0 END) AS subtotaal_lid,
                      c.voorraad 
                   FROM 
                      cursusdienst_bestellingen cb
                   JOIN 
                      cursusdienst c 
                   ON 
                      cb.cursus_id = c.id 
                   WHERE 
                      datum_verwijderd IS NULL AND 
                      datum_reservatie_mail IS NOT NULL AND
                      datum_afhaling IS NULL AND 
                      datum_afhaling_mail IS NULL AND 
                      studentid = '$studentid' AND 
                      cursus_id = '$cid' AND 
                      c.voorraad > 0
                  ) as subtotaal_lid,


               (SELECT SUM(prijs_niet_lid) FROM cursusdienst_bestellingen WHERE datum_verwijderd IS NULL AND datum_reservatie_mail IS NOT NULL AND datum_afhaling IS NULL AND datum_afhaling_mail IS NULL AND studentid = '$studentid' AND cursus_id = '$cid') as subtotaal_niet_lid
             FROM 
               cursusdienst c
             JOIN
               cursusdienst_bestellingen cb
             ON
               cb.cursus_id = c.id
             WHERE 
               c.id = '$cid' AND cb.datum_verwijderd IS NULL AND cb.datum_afhaling IS NOT NULL AND cb.datum_afhaling_mail IS NULL AND cb.studentid = '$studentid'
             ";

问题是SUM(CASE WHEN c.voorraad> 0 THEN prijs_lid ELSE 0 END)AS subtotaal_lid 我有两次subtotaal_lid。我认为这也不正确。 如果我设置cb.prijs_lid我有错误:操作数应该包含1列,如果我设置prijs_lid(之前没有cb。)我有错误:prijs_lid是不明确的。

我想在这里做的是让所有商品的总价格没有库存低于1的价格。所以我在这里c.voorraad> 0但结果始终是所有项目的总价格,而不仅仅是库存高于0的那些。

修改 表cursusdienst包含以下字段(例如):

id   prijs_lid   prijs_niet_lid   artikel  voorraad
1    24.00       25.00            Course1  12
2    30.00       35.00            Course2  -10

表cursusdienst_bestellingen包含以下字段(例如):

id   cursus_id   prijs_lid   prijs_niet_lid   artikel  studentid
1    1           24.00       25.00            Course1  123456789
2    2           30.00       35.00            Course2  123456789

表格(发票)中的输出 - 主要查询谁给我正确的输出:

Artikel   Aantal   Prijs
Course1   1        24.00

在输出表下面的totalprice表 - 子查询是错误的:

Subtotal: 24.00
Tax: 1.20
Total: 25.20

所以这里的SUM totalprice_member(=荷兰语中的totaalprijs_lid)这里的成员是24.00(荷兰语中的盖子)而成员不是54.00因为课程2的库存低于1.现在我有54.00的totaalprijs_lid什么是错...

总代码:

        <table cellpadding="0" cellspacing="0" width="600" class="w320">
            <tr>
              <td class="item-table">
                <table cellspacing="0" cellpadding="0" width="100%">
                  <tr>
                    <td class="title-dark" width="300">
                      Cursus
                    </td>
                    <td class="title-dark" width="163">
                      Aantal
                    </td>
                    <td class="title-dark" width="97">
                      Totaal
                    </td>
                  </tr>

<?php
    if (!empty($_POST['bachelor1'])) {
    foreach ($cursus as $cid) {

         $sql = "
select 
  c.voorraad,
  c.id as cid,
  cb.artikel as cbartikel,
  cb.prijs_lid as cbprijs_lid,
  cb.prijs_niet_lid as cbprijs_niet_lid,
  cb.studierichting as cbstudierichting,
  cb.studentid,
  case when c.voorraad > 0 then
    (
      select 
        sum(prijs_lid)
       from cursusdienst_bestellingen cbx
       where cbx.cursus_id = cb.cursus_id
         and cbx.studentid = cb.studentid
         and cbx.datum_afhaling is null
         and cbx.datum_afhaling_mail is null
         and cbx.datum_reservatie_mail is not null
         and cbx.datum_verwijderd is null
    )
  else 0 end as subtotaal_lid,
  case when c.voorraad > 0 then
    (
      select 
        sum(prijs_niet_lid)
       from cursusdienst_bestellingen cbx
       where cbx.cursus_id = cb.cursus_id
         and cbx.studentid = cb.studentid
         and cbx.datum_afhaling is null
         and cbx.datum_afhaling_mail is null
         and cbx.datum_reservatie_mail is not null
         and cbx.datum_verwijderd is null
    )
  else 0 end as subtotaal_niet_lid
from cursusdienst c
join cursusdienst_bestellingen cb on cb.cursus_id = c.id
where cb.datum_afhaling is not null 
  and cb.datum_afhaling_mail is null 
  and cb.datum_verwijderd is null 
  and cb.studentid = '$studentid'
  and c.id = '$cid'
                 ";
         $res = mysql_query($sql) or die (mysql_error());

         //$subtotaal1 = '';
         //$totaal1 = '';
         //$btw1 = '';

         while($row = mysql_fetch_assoc($res))
            { 
               $cursus_id1 = $row['cid'];
               $studierichting1 = $row['cbstudierichting'];
               $voorraad1 = $row['voorraad'];

               if ($num_rows_lid > 0) {
                   $prijs1 = round(number_format(($row['cbprijs_lid'] / 1.21), 2, '.', ''), 2);
               } else {
                   $prijs1 = round(number_format(($row['cbprijs_niet_lid'] / 1.21), 2, '.', ''), 2);
               }

               $artikel1 = $row['cbartikel'];
               $aantal1 = '1';

               $subtotaal_lid += number_format(round(($row['subtotaal_lid'] / 1.21), 2), 2, '.', '');
               $totaal_lid += number_format($row['subtotaal_lid'], 2, '.', '');
               $btw_lid = round(number_format(($totaal_lid - $subtotaal_lid), 2, '.', ''), 2);

               $subtotaal_niet_lid += number_format(round(($row['subtotaal_niet_lid'] / 1.21), 2), 2, '.', '');
               $totaal_niet_lid += number_format($row['subtotaal_niet_lid'], 2, '.', '');
               $btw_niet_lid = round(number_format(($totaal_niet_lid - $subtotaal_niet_lid), 2, '.', ''), 2);

?>
                  <tr>
                    <td class="item-col item">
                      <table cellspacing="0" cellpadding="0" width="100%">
                        <tr>
                          <td class="product">
                            <span style="color: #4d4d4d; font-weight:bold;"><?php echo wordwrap($artikel1, 20, "<br />\n"); ?></span>
                          </td>
                        </tr>
                      </table>
                    </td>
                    <td class="item-col quantity aantal">
                      <?php echo $aantal1; ?>
                    </td>
                    <td class="item-col">
                      <?php echo '€ '.($prijs1 * $aantal1); ?>
                    </td>
                  </tr>



<?php
         //$sql = "UPDATE cursusdienst_bestellingen SET datum_afhaling_mail = NOW() WHERE cursus_id = '$cursus_id1' AND datum_verwijderd IS NULL AND studentid = '$studentid'";
         //$res = mysql_query($sql) or die (mysql_error()); 

 } } } ?>


<!--
                  <tr>
                    <td class="item-col item">
                      <table cellspacing="0" cellpadding="0" width="100%">
                        <tr>
                          <td class="product">
                            <span style="color: #4d4d4d; font-weight: bold;">Pink Shoes</span> <br />
                            Newest styles
                          </td>
                        </tr>
                      </table>
                    </td>
                    <td class="item-col quantity aantal">
                      1
                    </td>
                    <td class="item-col price">
                      $10.50
                    </td>
                  </tr>
-->

                  <tr>
                    <td class="item-col item mobile-row-padding"></td>
                    <td class="item-col quantity"></td>
                    <td class="item-col price"></td>
                  </tr>

<?php
         if($num_rows_lid > 0) {
             $subtotaal = $subtotaal_lid;
             $btw = $btw_lid;
             $totaal = $totaal_lid;
         } else {
             $subtotaal = $subtotaal_niet_lid;
             $btw = $btw_niet_lid;
             $totaal = $totaal_niet_lid;
         }
?>
                  <tr>
                    <td class="item-col item">
                    </td>
                    <td class="item-col quantity" style="text-align:right; padding-right: 10px; border-top: 1px solid #cccccc;">
                      <span class="total-space">Subtotaal</span> <br />
                      <span class="total-space">BTW</span>  <br />
                      <span class="total-space" style="font-weight: bold; color: #4d4d4d">Totaal</span>
                    </td>
                    <td class="item-col price" style="text-align: left; border-top: 1px solid #cccccc;">
                      <span class="total-space"><?php echo '€ '.$subtotaal; ?></span> <br />
                      <span class="total-space"><?php echo '€ '.$btw; ?></span>  <br />
                      <span class="total-space" style="font-weight:bold; color: #4d4d4d"><?php echo '€ '.$totaal; ?></span>
                    </td>
                </table>
              </td>
            </tr>
        </table>

3 个答案:

答案 0 :(得分:1)

此代码返回不明确的列错误:

SUM(CASE WHEN c.voorraad > 0 THEN prijs_lid ELSE 0 END) AS subtotaal_lid,

此代码返回&#34;操作数应包含一个值&#34;:

SUM(CASE WHEN c.voorraad > 0 THEN cb.prijs_lid ELSE 0 END) AS subtotaal_lid,

此版本修复了上一个错误。操作数错误在查询的其他位置。这个子查询至少有一个问题:

(SELECT SUM(CASE WHEN c.voorraad > 0 THEN prijs_lid ELSE 0 END) AS subtotaal_lid,
        c.voorraad 
  . . . 
 )

您在上下文中使用子查询,并且需要单个值。这需要一个标量子查询,该子查询返回一列,最多一行。你可能打算:

(SELECT SUM(CASE WHEN c.voorraad > 0 THEN prijs_lid ELSE 0 END) AS subtotaal_lid
  . . . 
 )

答案 1 :(得分:0)

不明确的列意味着你有两个具有相同列名的表:MySQL必须使用哪一个?

使用类似tableName.columnName的表名为每个列名添加前缀。如果FROM tableName AS aliasName过长,请使用表别名(JOIN tableName AS aliasNametableName)。

始终这样做,因为它会使您的查询更加健壮。即:如果表A包含列a而表B包含列b,那么您现在不需要前缀 。但我鼓励您始终使用此前缀,因为您可以稍后向表b添加列A,如果没有前缀,则会破坏您的代码。

将每个?的表别名放在那里。

顺便说一句,您可能可以使用INNER/LEFT JOIN(可能使用子表)重写该查询,而不是在列值中嵌套SELECT(这通常更慢,更难阅读)。

SELECT 
    c.voorraad AS ?,
    c.id AS cid,
    cb.artikel AS cbartikel,
    cb.prijs_lid AS cbprijs_lid,
    cb.prijs_niet_lid AS cbprijs_niet_lid,
    cb.studierichting AS cbstudierichting,
    cb.studentid AS ?,
    (
        SELECT
            SUM(CASE WHEN c.voorraad > 0 THEN ?.prijs_lid ELSE 0 END) AS subtotaal_lid,
            c.voorraad
        FROM cursusdienst_bestellingen AS cb
        LEFT JOIN cursusdienst AS c ON cb.cursus_id = c.id
        WHERE 
            ?.datum_verwijderd IS NULL
            AND ?.datum_reservatie_mail IS NOT NULL
            AND ?.datum_afhaling IS NULL
            AND ?.datum_afhaling_mail IS NULL
            AND ?.studentid = '$studentid'
            AND ?.cursus_id = '$cid'
            AND c.voorraad > 0
    ) AS subtotaal_lid,
    (
        SELECT
            SUM(?.prijs_niet_lid) AS ?
        FROM cursusdienst_bestellingen AS ?
        WHERE 
            ?.datum_verwijderd IS NULL 
            AND ?.datum_reservatie_mail IS NOT NULL
            AND ?.datum_afhaling IS NULL
            AND ?.datum_afhaling_mail IS NULL 
            AND ?.studentid = '$studentid' 
            AND ?.cursus_id = '$cid'
    ) AS subtotaal_niet_lid
FROM cursusdienst AS c
LEFT JOIN cursusdienst_bestellingen AS cb ON cb.cursus_id = c.id
WHERE
    c.id = '$cid' 
    AND cb.datum_verwijderd IS NULL 
    AND cb.datum_afhaling IS NOT NULL 
    AND cb.datum_afhaling_mail IS NULL 
    AND cb.studentid = '$studentid'

答案 2 :(得分:0)

我仍然不知道你到底在想什么。您的示例数据无法解释任何内容。

Anayway,您必须以某种方式将子查询与主查询相关联。在主查询中,您可以选择c和cb。在子查询中,您需要与主查询中显示的记录相关的总和。这或多或少应该是:

select 
  c.voorraad,
  c.id as cid,
  cb.artikel as cbartikel,
  cb.prijs_lid as cbprijs_lid,
  cb.prijs_niet_lid as cbprijs_niet_lid,
  cb.studierichting as cbstudierichting,
  cb.studentid,
  case when c.voorraad > 0 then
    (
      select 
        sum(prijs_lid)
       from cursusdienst_bestellingen cbx
       where cbx.cursus_id = cb.cursus_id
         and cbx.studentid = cb.studentid
         and cbx.datum_afhaling is null
         and cbx.datum_afhaling_mail is null
         and cbx.datum_reservatie_mail is not null
         and cbx.datum_verwijderd is null
    )
  else 0 end as subtotaal_lid,
  case when c.voorraad > 0 then
    (
      select 
        sum(prijs_niet_lid)
       from cursusdienst_bestellingen cbx
       where cbx.cursus_id = cb.cursus_id
         and cbx.studentid = cb.studentid
         and cbx.datum_afhaling is null
         and cbx.datum_afhaling_mail is null
         and cbx.datum_reservatie_mail is not null
         and cbx.datum_verwijderd is null
    )
  else 0 end as subtotaal_niet_lid
from cursusdienst c
join cursusdienst_bestellingen cb on cb.cursus_id = c.id
where cb.datum_afhaling is not null 
  and cb.datum_afhaling_mail is null 
  and cb.datum_verwijderd is null 
  and cb.studentid = '$studentid'
  and c.id = '$cid'

我不知道这与你真正想要的有多接近。但希望你有这个想法。由于两个子查询选择相同的记录,因此应将其移至FROM子句:

select 
  c.voorraad,
  c.id as cid,
  cb.artikel as cbartikel,
  cb.prijs_lid as cbprijs_lid,
  cb.prijs_niet_lid as cbprijs_niet_lid,
  cb.studierichting as cbstudierichting,
  cb.studentid,
  case when c.voorraad > 0 then total.sum_prijs_lid else 0 end as subtotaal_lid,
  case when c.voorraad > 0 then total.sum_prijs_niet_lid else 0 end as subtotaal_niet_lid
from cursusdienst c
join cursusdienst_bestellingen cb on cb.cursus_id = c.id
join
(
  select 
    cursus_id, 
    studentid, 
    sum(prijs_lid) as sum_prijs_lid, 
    sum(prijs_niet_lid) as sum_prijs_niet_lid
   from cursusdienst_bestellingen
   where datum_afhaling is null
     and datum_afhaling_mail is null
     and datum_reservatie_mail is not null
     and datum_verwijderd is null
   group by cursus_id, studentid
) total on  total.cursus_id = cb.cursus_id
        and total.studentid = cb.studentid
where cb.datum_afhaling is not null 
  and cb.datum_afhaling_mail is null 
  and cb.datum_verwijderd is null 
  and cb.studentid = '$studentid'
  and c.id = '$cid'