2015-04-19 2 views
1

У меня есть таблица таблиц и учебников таблицы в базе данных SQLite. Я пытаюсь выбрать текущий учебник. Есть мои таблицыLaravel eloquent выберите первую строку каждой группы по

  • Испытуемые стол:

    ------------------- 
    | id | name | 
    ------------------- 
    | 1 | Chemistry | 
    | 2 | Physic | 
    ------------------- 
    
  • Учебники таблица:

    ----------------------------------------- 
    | id | name | subj_id | completed | 
    ----------------------------------------- 
    | 1 | chapter 1 | 1  |  1  | 
    | 2 | chapter 2 | 1  |  0  | 
    | 3 | chapter 3 | 1  |  0  | 
    | 4 | chapter 1 | 2  |  1  | 
    | 5 | chapter 2 | 2  |  1  | 
    | 6 | chapter 3 | 2  |  0  | 
    | 7 | chapter 4 | 2  |  0  | 
    ----------------------------------------- 
    

Мой текущий красноречива:

$query->where('completed', false)->groupBy('subj_id')->get(); 

И это возвращает:

----------------------------------------- 
| id | name | subj_id | completed | 
----------------------------------------- 
| 3 | chapter 3 | 1  |  0  | 
| 7 | chapter 4 | 2  |  0  | 
----------------------------------------- 

Теперь я хочу, чтобы выбрать идентификатор 2 и 6.

----------------------------------------- 
| id | name | subj_id | completed | 
----------------------------------------- 
| 2 | chapter 2 | 1  |  0  | 
| 6 | chapter 3 | 2  |  0  | 
----------------------------------------- 

Как я мог получить идентификатор 2 и 6 с помощью SQLite?

+0

По какой логике вы выбираете 2 и 6 более 3 и 7? – lukasgeiter

+0

Привет lukas просто id 2 - глава 2 химии, id 3 - глава 3 химии. id 1 завершен. Поэтому я хочу получить текущую учебную главу химии, а также физическую тему. –

ответ

3

Моя проблема решена путем помощи @ zerofl4g.

Этот красноречивый помощник @ zerofl4g.

$query->select(DB::raw("SELECT MIN(id), name, subj_id FROM tutorials 
WHERE completed = 0 GROUP BY subj_id")); 

Это не работает для меня, но мне очень помогает. Я не знаю точной причины, по которой не работал, но я думаю, что использую его как подзапрос. Поэтому я получил дубликат и ошибки. Он, безусловно, должен работать для тех, кто хочет использовать один запрос.

Мое решение просто выбрать столбцы с БД :: сырца и -> из («учебников») также является необязательным, так как это подзапрос длинного запроса

$query->select(DB::raw('MIN(id) as id, name, subj_id'))->from('tutorials') 
->where('completed', false)->groupBy('subj_id'); 

Final красноречив я использую

$query->select(DB::raw('MIN(id) as id, name, subj_id')) 
->where('completed', false)->groupBy('subj_id');` 

Надеемся быть полезными.

0

Если вы хотите вернуть первую строку в группе, вы можете попробовать код ниже. Я думаю, что вы хотите получить последнюю главу в теме, которая не заканчивается.

$data = Tutorial::where('completed', 0)->get(); 
$groups = $data->groupBy('subj_id'); 

$results = []; 
foreach($groups as $group) { 
    $results[] = head($group); 
} 
return $results; 
  1. Получить все учебники строку

  2. Затем группа по 'subj_id'. Данные, которые вы получаете, как показано ниже

    { 1: [{ ID: "2", название: "Глава 2", subj_id: "1", завершена: "0" }, { ID: "3", название: "глава 3", subj_id: "1", завершена: "0" }],

    2: [{ 
        id: "6", 
        name: "chapter 3", 
        subj_id: "2", 
        completed: "0" 
    }, { 
        id: "7", 
        name: "chapter 4", 
        subj_id: "2", 
        completed: "0" 
    }] 
    

    }

  3. Перед каждой группой и получите минимальный идентификатор, используя вспомогательную функцию head() в laravel.

+0

Привет, zer0fl4g, Спасибо за ваш ответ. мой запрос - это просто подзапрос длинного запроса. Я не могу использовать foreach или любую функцию php. если я запустил этот запрос 'select min (id), name, subj_id из учебников, где completed = 0 group by subj_id' Я получаю идентификаторы 2 и 6. Но проблема в том, что я не знаю, как запустить этот запрос в качестве подзапроса. В любом случае, спасибо и оцените вашу помощь. –

+0

Можете ли вы поделиться своим полным запросом – Faiz

+0

Я сделал легко понятную маленькую таблицу. '$ Членов = членов :: есть ('лотерей') -> с ([ \t \t \t 'лотерей' => функция ($ запроса) { \t \t \t \t $ query-> выберите (массив ('lotteries.id », 'lotteries.name', 'basic_amt', 'lotteries.total_amt')); \t \t \t}, \t \t \t 'lotteries.prizes' => функция ($ запроса) { \t \t \t $ запрос \t \t \t -> select (array ('prizes.id', 'prizes.lottery_id', 'prizes.p rize_number», 'prizes.current_amt')) \t \t \t -> где ('завершено', ложно) \t \t \t -> группеПо ('lottery_id'); \t \t \t \t]) -> get (array ('members.id', 'members.name')) -> toJSON(); \t \t // $ members = Member :: all (array ('id', 'name')) -> toJSON(); \t \t возвращение $ членов; ' –

Смежные вопросы