#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