За последние 24 часа нас посетили 16656 программистов и 1643 робота. Сейчас ищут 1760 программистов ...

Не правильный строка запроса!

Тема в разделе "MySQL", создана пользователем engine.energy, 19 фев 2016.

  1. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    Почему так не работает?

    Хотел получить рецепт и список требование для рецепта.

    Ошибка: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s)' in

    Код (PHP):
    1. "SELECT `recipes`.*, (SELECT * FROM `recipe_components` WHERE `item_id` = :item_id) AS components FROM `recipes` WHERE `id` = :item_id LIMIT 1"
    2.  
    :item_id в PDO!
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Ошибка 1241 говорит о том, что у вас неверное число столбцов в подзапросе. Допустимо применять подзапросы, которые возвращают несколько столбцов с целью сравнения, но в других контекстах подзапрос должен быть скалярным операндом.
    Короче, я не знаю что и как у вас устроено в таблицах и какой результат вы хотите получить, но пробуйте сделать запрос с помощью UNION / UNION ALL или JOIN. Например:
    Код (PHP):
    1. SELECT 
    2.     `recipes`.*, `recipe_components`.* 
    3. FROM `recipes`
    4. INNER JOIN 
    5.     `recipe_components` ON (`recipe_components`.`item_id` = `recipes`.`id`)
    6. WHERE `id` = :item_id
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    отличное объяснение! только обращу внимание на то, что колонка id, как правило, есть в каждой таблице. поэтому в данном контексте её нельзя упоминать без привязки к таблице/алиасу. вероятно надо так:
    … WHERE `recipes`.`id` = :item_id

    Добавлено спустя 5 минут 8 секунд:
    еще своих домыслов добавлю.
    насколько я понимаю, рецепт и требования к рецепту относятся как один-ко-многим. когда мы клеим их джойном, мы получаем записи со множеством повторов из таблицы recipes. возможно для странички с конкретным рецептом (`recipes`.`id` = :item_id) нет смысла в таком джойне. хотя это не ошибка.
    удобнее будет обработать два отдельных запроса: получить одну строчку из recipes и несколько из recipe_items.
     
  4. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    Deonis, Я хотел получить компоненты для рецепты.
    Например у компонент для 1 рецепты имеет:
    1. Пила
    2. Бревно
    Каждый рецепт требует компоненты чтобы сделать вещи.

    Если из компоненты не хватает то рецепт не будет выполнять создание вещи "Доска"
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    engine.energy, это всё итак было понятно. тебе Deonis уже ответил по существу: из-за чего ошибка происходит и как можно переписать запрос чтобы получить все компоненты рецепта.

    Добавлено спустя 6 минут 32 секунды:
    Ещё вариант: получаем список названий компонент в строку через запятую
    Код (PHP):
    1. SELECT r.*, c.`components`
    2. FROM `recipes` AS r
    3. INNER JOIN 
    4.   (
    5.     SELECT  `item_id`, GROUP_CONCAT(`recipe_components`.`name`) AS `components` 
    6.     FROM `recipe_components`
    7.     GROUP BY `item_id`
    8.   ) AS c ON (c.`item_id` = r.`id`)
    9. WHERE r.`id` = :item_id
    Здесь я предположил, что поле с название компоненты `name`. Если оно другое, просто замени имя.