╔═══╦══════════════╦═════════════╗
║ ║id ║name ║
╠═══╬══════════════╬═════════════╣
║ ║ 1 ║a1 ║
║ ║ 2 ║b1 ║
║ ║ 3 ║b2 ║
║ ║ 4 ║c1 ║
║ ║ 5 ║c2 ║
╚═══╩══════════════╩═════════════╝
Это моя таблица в mysql
Выполнение этого запроса в mysql:
select * from (select * from courses where name like 'a%') as t1 cross join (select * from courses where name like 'b%') as t2 cross join (select * from courses where name like 'c%') as t3
возвращает это:
Однако, когда я пытаюсь запустить его на larael, чтобы отобразить результат, я получаю что-то другое.
Вот как я выполняю в laravel:
$posts = DB::select(DB::raw("select * from (select * from courses where name like 'a%') as t1 cross join (select * from courses where name like 'b%') as t2 cross join (select * from courses where name like 'c%') as t3"));
Вот что возвращает $posts:
[{"id":4,"name":"c1"},{"id":4,"name":"c1"},{"id":5,"name":"c2"},{"id":5,"name":"c2"}]
Я полагаю, он возвращает только последние два столбца запроса, если мы сравним его с исходным результатом, возвращенным в mysql.
Есть идеи, как получить полный результат?
@Quezler возвращает запрос обратно! : выберите * из (выберите * из курсов, где имя как 'a%') как перекрестное соединение t1 (выберите * из курсов, где имя как 'b%') как перекрестное соединение t2 (выберите * из курсов, где имя как 'c%' ) как t3
Попробуйте заключить свои подзапросы в круглые скобки.






t3 перезаписывает значения t1 и t2. Вы должны использовать псевдонимы:
select t1.id as t1_id, t1.name as t1_name,
t2.id as t2_id, t2.name as t2_name,
t3.id as t3_id, t3.name as t3_name
Вы также должны использовать построитель запросов вместо необработанного SQL.
Спасибо. Есть ли какой-то особый недостаток в использовании необработанного SQL? Я считаю, что необработанный SQL более естественен.
Когда вы вставляете пользовательский ввод в запрос, намного сложнее писать небезопасный код с помощью построителя запросов. Также вы можете использовать один и тот же PHP-код для нескольких баз данных (MySQL, SQLite и т. д.).
Могу ли я включить в этот запрос предложение where? Если я попробую добавить это так: выберите t1.id как t1_id, t1.name как t1_name, t2.id как t2_id, t2.name как t2_name, t3.id как t3_id, t3.name как t3_name (выберите * из курсов, где назовите как 'a%') как перекрестное соединение t1 (выберите * из курсов, где имя как 'b%') как перекрестное соединение t2 (выберите * из курсов, где имя как 'c%') как t3, где t1_name = 'test'; Выдает ошибку "# 1054 - Неизвестный столбец" t1_name "в предложении where
Используйте оригинальное название столбца: where('t1.name', 'test')
Каков результат
DB::rawбезDB::select?