mysql — Medoo PHP Framework — ‘select’ ‘left join’ using ‘и’ для проверки условия (как в col = val)

Я пытаюсь выбрать левое соединение и использовать AND для сравнения столбца с определенным значением, то есть условием.

Проблема в том, что я не знаю, где добавить условие. Приведенный ниже запрос medoo возвращает первый идентификатор рубашки с тем же идентификатором пользователя, даже если для всех ‘is_wearing_shirt’ установлено значение 0. Однако обычный запрос mysql возвращает ожидаемые данные.

Вот запрос Medoo:

$db->select('users', array(
'[>]shirts' => array(
'user_id' => 'shirt_owner_id',
'is_wearing_shirt' => 1 // equivalent to AND is_wearing_shirt = 1
)
), array(
'user_id',
'shirt_id(shirt_id_being_worn)'
) , array(
'user_id' => 1,
'LIMIT' => 1
));
// always returns a shirt_id (even if all rows have is_wearing_shirt set to 0, in which case, shirt_id should be null)

Вот обычный запрос MySQL, который работает:

SELECT u.user_id, s.shirt_id
FROM  `cvs_users` u
LEFT JOIN `shirts` s
ON user_id = shirt_owner_id
AND shirt_being_worn = 1
WHERE user_id = 1
//returns the correct shirt_id

2

Решение

Объединение логических выражений с использованием AND / OR в предложении соединения в настоящее время не поддерживается библиотекой medoo (medoo 0.9.6.2). Вы можете использовать только query($query) метод, данный medoo для непосредственного выполнения SQL-запросов. Для вашего примера запрос выглядит так:

$data = $db->query("SELECT u.user_id, s.shirt_id FROM `cvs_users` u
LEFT JOIN `shirts` s
ON user_id = shirt_owner_id AND shirt_being_worn = 1
WHERE user_id = 1")->fetchAll();

Обратите внимание на призыв к fetchAll() в конце, чтобы получить запрашиваемые данные.
Я столкнулся с той же проблемой, и отладка кода medoo.php показала, что условия AND / OR рассматриваются только в предложении where. Возможно, они добавят эту функцию в будущем обновлении. Я начал проблему, описывающую проблему: Medoo Issue

1

Другие решения

Я отправил запрос на удаление, который пытается это исправить: https://github.com/catfan/Medoo/pull/206

Что я сделал, чтобы изменить строки medoo.php 564-568

// For ['column1' => 'column2']
else
{
$relation = 'ON ' . $table . '."' . key($relation) . '" = "' . (isset($match[5]) ? $match[5] : $match[3]) . '"."' . current($relation) . '"';
}

в

// For ['column1' => 'column2']
else
{
$and_relation = 'ON ' . $table . '."' . key($relation) . '" = "' . (isset($match[5]) ? $match[5] : $match[3]) . '"."' . current($relation) . '"';
// if there is more than one condition
if (count($relation) > 1) {

// remove the "ON" part
array_shift($relation);

// add the condition to the join
foreach ($relation as $key => $value) {
// if the [$] value modifier is present
if (preg_match('/\[\${1}\]/', $key) === 1) {
$key = preg_replace('/\[\${1}\]/', '', $key);
$and_relation .= ' AND "' . (isset($match[5]) ? $match[5] : $match[3]) . '"."' . $key . '" = ' . $value;
continue;
}
// add additional table_relation
$and_relation .= ' AND ' . $table . '."' . $key . '" = "' . (isset($match[5]) ? $match[5] : $match[3]) . '"."' . $value . '"';
}
}

// write our new relation back
$relation = $and_relation;
}

Замечания:

Если добавление является значением для объединенной таблицы, используйте модификатор [$]: 'right_table_column[$]' => value, Если значение является строкой, вы должны заключить его в кавычки перед передачей в массив join, например,

// $db = Medoo Object
$value = $db->quote('myString');

$db->select(['table',
[
'[>]right_table' => [
'join_condition' => 'join_condition', // ON
'additional_condition[$]' => $value, // AND
],
],
[
...where conditions...
]
]);

Если это табличное отношение, используйте его как любое другое условие соединения 'left_table_column' => 'right_table_column'

1

По вопросам рекламы [email protected]