MySQL много операторов 'и' - PullRequest
       15

MySQL много операторов 'и'

1 голос
/ 08 ноября 2011

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

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

Ответы [ 4 ]

2 голосов
/ 08 ноября 2011

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 голосов
/ 08 ноября 2011

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

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, потому что она всегда ложна.Если вам нужно получить записи, имеющие tx_type = 4 или tx_type = 14, вы можете изменить последние строки SQL с помощью

AND b.tx_type IN (4,14)
1 голос
/ 08 ноября 2011

Полагаю, вы имели в виду 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)
0 голосов
/ 08 ноября 2011

Эта часть:

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