【问题标题】:MySql query: get all customers that has their ID in both Customer and Customer_x_Billing tableMySql 查询:获取在 Customer 和 Customer_x_Billing 表中都有 ID 的所有客户
【发布时间】:2019-07-12 00:38:05
【问题描述】:

我正在使用 C# 控制台应用程序从 MySql 数据库中获取一些数据,但在正确查询时遇到了一些问题

现在这样:

SELECT * FROM Customer
WHERE EXISTS ( SELECT * FROM Customer_x_Billing c WHERE Customer.`customer id` = c.customer_id)
AND 2011 -04 -03 < ( SELECT last_changed FROM Customer_x_Billing c WHERE Customer.`customer id` = c.customer_id )
ORDER BY Customer.`customer id`

如何改进这一点? 我想获取在 Customer 和 Customer_x_Billing 表中都有 ID 并且 Customer_x_Billing 中的 last_changed 日期大于参数(在本例中为 2011-04-03)的所有客户。如果我将日期设置为 2012-04-03,它不应该返回任何行,但它会返回与第一个条件匹配的所有记录(两者都存在)。

【问题讨论】:

  • 没有对您的查询进行太多分析,您的查询最明显的问题是您指定日期参数的方式。你在那里得到的被解释为一个算术表达式2011 - 04 - 03,它会被相应地评估,然后在与子查询的结果进行比较时隐式转换为日期/时间值。为了将参数解释为日期,您需要将其括在单引号中,就像大多数答案所建议的那样。

标签: c# mysql sql


【解决方案1】:

试试下面一个

SELECT * FROM Customer
INNER JOIN
Customer_x_Billing ON Customer.`customer id` = Customer.customer_id
WHERE last_changed > 2011 -04 -03
ORDER BY Customer.`customer id`

您查询的问题是您正在扫描 Customer_x_Billing 表两次,这是不需要的,最好进行一次内部连接,这将满足您的第一个条件,即通过编写 where 子句来满足存在一个和第二个条件。

【讨论】:

    【解决方案2】:

    SELECT c.* FROM Customer c INNER JOIN Customer_x_Billing cb ON cb.customer_id = c.id WHERE DATE(cb.last_changed) &gt; '2011-04-03' ORDER BY c.id;

    【讨论】:

      【解决方案3】:

      如果我没看错你的问题,我相信你可以通过 INNER JOIN 实现这一点......

      SELECT *
      FROM Customer c
      INNER JOIN Customer_x_Billing b
          ON c.customer_id = b.customer_id
      WHERE last_changed_date > '2011-04-03'
      

      【讨论】:

        【解决方案4】:
        SELECT Customer.* FROM Customer c INNER JOIN Customer_x_Billing b
        ON c.`customer id`=b.`customer id`
        WHERE last_changed>'2011-04-03'
        ORDER BY c.`customer id`
        

        无论如何要注意查询中的日期...

        【讨论】:

          【解决方案5】:

          或多或少是这样的。

          using (SqlConnection con = new SqlConnection(connectionString))
          {
            using (SqlCommand cmd = new SqlCommand())
            {
              cmd.Connection = con;
              cmd.CommandText 
                = "SELECT * FROM Custromer c JOIN Customer_x_Billing cb ON c.'customer id' = cd.'customer id' Where last_change < @lastChangeDate";
              cmd.Parameters.AddWithValue("@lastChangeDate",  new DateTime(2011,04,03));
              using (SqlDataReader drd = cmd.ExecuteReader())
              {
                while (drd.Read())
                {
                  // Read from data reader
                }
              }
            }
          }
          

          为了您的应用程序,您应该熟悉一些数据库教程,并尝试理解关系数据库的概念。

          【讨论】:

            猜你喜欢
            • 2022-01-19
            • 1970-01-01
            • 2021-09-25
            • 1970-01-01
            • 1970-01-01
            • 2012-06-20
            • 1970-01-01
            • 2021-02-01
            • 1970-01-01
            相关资源
            最近更新 更多