Почему так не работает? Хотел получить рецепт и список требование для рецепта. Ошибка: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s)' in Код (PHP): "SELECT `recipes`.*, (SELECT * FROM `recipe_components` WHERE `item_id` = :item_id) AS components FROM `recipes` WHERE `id` = :item_id LIMIT 1" :item_id в PDO!
Ошибка 1241 говорит о том, что у вас неверное число столбцов в подзапросе. Допустимо применять подзапросы, которые возвращают несколько столбцов с целью сравнения, но в других контекстах подзапрос должен быть скалярным операндом. Короче, я не знаю что и как у вас устроено в таблицах и какой результат вы хотите получить, но пробуйте сделать запрос с помощью UNION / UNION ALL или JOIN. Например: Код (PHP): SELECT `recipes`.*, `recipe_components`.* FROM `recipes` INNER JOIN `recipe_components` ON (`recipe_components`.`item_id` = `recipes`.`id`) WHERE `id` = :item_id
отличное объяснение! только обращу внимание на то, что колонка id, как правило, есть в каждой таблице. поэтому в данном контексте её нельзя упоминать без привязки к таблице/алиасу. вероятно надо так: … WHERE `recipes`.`id` = :item_id Добавлено спустя 5 минут 8 секунд: еще своих домыслов добавлю. насколько я понимаю, рецепт и требования к рецепту относятся как один-ко-многим. когда мы клеим их джойном, мы получаем записи со множеством повторов из таблицы recipes. возможно для странички с конкретным рецептом (`recipes`.`id` = :item_id) нет смысла в таком джойне. хотя это не ошибка. удобнее будет обработать два отдельных запроса: получить одну строчку из recipes и несколько из recipe_items.
Deonis, Я хотел получить компоненты для рецепты. Например у компонент для 1 рецепты имеет: 1. Пила 2. Бревно Каждый рецепт требует компоненты чтобы сделать вещи. Если из компоненты не хватает то рецепт не будет выполнять создание вещи "Доска"
engine.energy, это всё итак было понятно. тебе Deonis уже ответил по существу: из-за чего ошибка происходит и как можно переписать запрос чтобы получить все компоненты рецепта. Добавлено спустя 6 минут 32 секунды: Ещё вариант: получаем список названий компонент в строку через запятую Код (PHP): SELECT r.*, c.`components` FROM `recipes` AS r INNER JOIN ( SELECT `item_id`, GROUP_CONCAT(`recipe_components`.`name`) AS `components` FROM `recipe_components` GROUP BY `item_id` ) AS c ON (c.`item_id` = r.`id`) WHERE r.`id` = :item_id Здесь я предположил, что поле с название компоненты `name`. Если оно другое, просто замени имя.