MySQL много инструкций «и»

#mysql #database #select #fetch

#mysql #База данных #выберите #извлечение

Вопрос:

У меня есть это утверждение, которое является неправильным способом сделать это, но как мне заставить это утверждение работать (результат инструкции должен содержать все И в нем)

 SELECT a.username, a.first_name, a.last_name
     , b.tx_time, b.account_id
     , a.id 
     , b.table_id, b.tx_type, b.amount 
FROM punter a
   , account_transaction b 
WHERE b.tx_time >= '2011-07-01' 
  AND b.tx_time < '2011-09-30' 
  AND b.account_id = a.id 
  AND b.tx_type = 4 
  AND b.tx_type = 14
  

Ответ №1:

AND b.tx_type = 4 AND b.tx_type = 14 выдаст вам пустой результирующий набор. Один столбец может иметь только одно значение одновременно.

 SELECT a.username, a.first_name, a.last_name, 
       b.tx_time, b.account_id, a.id,
       b.table_id, b.tx_type, b.amount 
FROM punter a 
INNER JOIN account_transaction b ON b.account_id = a.id
WHERE b.tx_time BETWEEN '2011-07-01' AND '2011-09-30' AND b.tx_type IN (4,14) 
  

Ответ №2:

Вы могли бы использовать явное объединение, чтобы немного упростить:

 SELECT a.username, a.first_name, a.last_name, 
       b.tx_time, b.account_id, a.id,
       b.table_id, b.tx_type, b.amount 
FROM punter a INNER JOIN account_transaction b 
    ON b.account_id = a.id
WHERE b.tx_time BETWEEN '2011-07-01' AND '2011-09-30' 
  AND b.tx_type = 4 
  AND b.tx_type = 14
  

Обратите внимание, что я думаю, что это ошибка с использованием b.tx_type = 4 AND b.tx_type = 14 , потому что это всегда false. Если вам нужно получить записи, содержащие tx_type = 4 or tx_type = 14 , вы можете изменить последние строки SQL с помощью

 AND b.tx_type IN (4,14)
  

Ответ №3:

Я просто предполагаю, что вы имели в виду b.tx_type = 4 OR b.tx_type = 14

 SELECT a.username, a.first_name, a.last_name, b.tx_time, 
b.account_id, a.id, b.table_id, b.tx_type, b.amount 
FROM punter a, account_transaction b 
WHERE b.tx_time >= '2011-07-01' AND b.tx_time < '2011-09-30' 
AND b.account_id = a.id 
-- AND b.tx_type = 4 AND b.tx_type = 14
AND b.tx_type in (4, 14)
  

Ответ №4:

Эта часть:

 AND b.tx_type = 4 
AND b.tx_type = 14
  

гарантирует, что вы получите нулевые строки в результате.


Если вы хотите иметь punters транскрипции обоих типов 4 и 14 , вам нужно JOIN дважды привести к таблице b :

 SELECT a.username, a.first_name, a.last_name
     , b1.tx_time AS tx_time_1
     , b2.tx_time AS tx_time_2
     , a.id 
     , b1.table_id AS table_id_1, b1.tx_type AS tx_type_1, b1.amount AS amount_1 
     , b2.table_id AS table_id_2, b2.tx_type AS tx_type_2, b2.amount AS amount_2 
FROM punter a
  JOIN account_transaction b1
    ON b1.account_id = a.id 
  JOIN account_transaction b2
    ON b2.account_id = a.id 

WHERE b1.tx_time >= '2011-07-01' 
  AND b1.tx_time < '2011-09-30' 
  AND b1.tx_type = 4

  AND b2.tx_time >= '2011-07-01' 
  AND b2.tx_time < '2011-09-30' 
  AND b2.tx_type = 14