Я пытаюсь выбрать левое соединение и использовать 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
Объединение логических выражений с использованием 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
Я отправил запрос на удаление, который пытается это исправить: 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'