Запрос MySql: получить всех клиентов, чей идентификатор указан в таблице Customer и Customer_x_Billing - PullRequest
0 голосов
/ 11 апреля 2011

Я использую консольное приложение 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, а дата последнего изменения в Customer_x_Billing больше параметра (в этом случае 2011-04-03).Если я установлю дату на 2012-04-03, она не должна возвращать ни одной строки, но возвращает все записи, которые соответствуют первому условию (существуют в обоих).

Ответы [ 5 ]

1 голос
/ 11 апреля 2011

Попробуйте ниже одной

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.

0 голосов
/ 11 апреля 2011

Более или менее так.

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
      }
    }
  }
}

Ради вашего приложения вы должны ознакомиться с некоторым руководством по базам данных и попытаться понять концепцию реляционных баз данных.

0 голосов
/ 11 апреля 2011
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`

В любом случае остерегайтесь дат в вашем запросе ...

0 голосов
/ 11 апреля 2011

Если я читаю ваш вопрос правильно, я верю, что вы можете достичь этого с ВНУТРЕННИМ СОЕДИНЕНИЕМ…

SELECT *
FROM Customer c
INNER JOIN Customer_x_Billing b
    ON c.customer_id = b.customer_id
WHERE last_changed_date > '2011-04-03'
0 голосов
/ 11 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...