Nano Hash - криптовалюты, майнинг, программирование

Как написать подзапрос в yii2 «где»?

У меня есть этот запрос:

select * from dias_clases as dc
inner join clases as cl on cl.clase_id = dc.clase
inner join asistencias as asis on asis.dia_clase = dc.dc_id
where( 
clase in(select ce.clase from clases_estudiantes as ce where ce.estudiante = 321)
or dc_id in (select cr.dia_clase from clase_recuperada as cr where cr.estudiante = 321)
)
and fecha < '2017-04-26'
and cl.disciplina = 9
and dc.estado = 1
group by dc.dc_id
order by dc.fecha desc

Он отлично работает в консоли mysql. Мне нужен тот же запрос в Yii2 с активной записью, и я получил это:

$dias_clases = DiasClases::find()
                ->innerJoin("clases as cl", "cl.clase_id = clase")
                ->leftJoin("asistencias as asis", "asis.dia_clase = dc_id")
                ->where("
                    clase in(
                        select ce.clase from clases_estudiantes as ce where ce.estudiante = :estudiante
                    )
                    or dc_id in (
                        select cr.dia_clase from clase_recuperada as cr where cr.estudiante = :estudiante
                    )", [":estudiante" => $estudiante->estudiante_id]
                )
                ->andWhere("fecha < :fecha", [":fecha" => $fecha])
                ->andWhere(["cl.disciplina" => $disciplina])
                ->andWhere(["estado" => DiasClases::TERMINADA])
                ->orderBy(["fecha" => SORT_DESC])
                ->all();

Но "где" не работает должным образом. Результаты, которые я получаю, неверны, и я думаю, что это потому, что эта часть:

where( 
    clase in(select ce.clase from clases_estudiantes as ce where ce.estudiante = 321)
    or dc_id in (select cr.dia_clase from clase_recuperada as cr where cr.estudiante = 321)
    )

не выполняется так же, как в консоли. Скобка нужна

27.04.2017

  • Опубликуйте запрос, который вы получаете 28.04.2017

Ответы:


1

Предполагая, что у вас есть модель ClasesEstudiantes для таблицы clases_estudiantes, вы можете создать подзапрос, например:

$subquery1 = ClasesEstudiantes::find()
      ->select('clase')->andWhere([ 'estudiante'>=  $estudiante])

DiasClases::find()
     ->innerJoin("clases as cl", "cl.clase_id = clase")
     ->leftJoin("asistencias as asis", "asis.dia_clase = dc_id")
     ->where('in', 'clase', $subquery1)
     .......

you can do the same for the other subquery  using `orWhere(   )`
28.04.2017

2

Я пошел в проект yii2 github и спросил напрямую, и это был ответ, который они дают, и он работает как шарм:

->where(['or', 
        [
            'in',
            'clase', 
            (new Query)
                ->select('ce.clase')
                ->from('clases_estudiantes')
                ->where(['estudiante' => $estudiante->estudiante_id])
        ],
        [
            'in', 
            'dc_id', 
            (new Query)
                ->select('dia_clase')
                ->from('clase_recuperada')
                ->where(['estudiante' => $estudiante->estudiante_id])
        ]

    ])

И это URL для проверки: здесь

07.05.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..