• ? MySQL народ, не могу понять...
    есть две таблицы, `catalog` и `color`
    в `color` ест поле `catalog`, которое указывает на `catalog`.`id`
    в `catalog` никаких привязок к `color` нету.
    Суть в том, что в запросе надо получить ТОЛЬКО одну запись, представим, что первую...
    Т.е. есть `catalog`.`id` = 100
    `color`.`id` = 1 ; `color`.`catalog` = 100
    `color`.`id` = 2 ; `color`.`catalog` = 100
    `color`.`id` = n ; `color`.`catalog` = 100
    таки вот, как бы мне так получить только одну запись вида
    `catalog`.`id` = 1, `color`.`id` = 1... Через левое соединение (`catalog` LEFT JOIN `color`) соединение тянет все строки из color, соответственно.
    З.Ы. такой формат таблиц делал не я, а упоротый вебдезигнер.
    З.З.Ы. особо на скуле не писал, так что не пинайте сильно :)

Replies (35)

  • @pessok,
    select top 1 color.id, color.name, color.catalog where color.catalog=catalog.id and catalog.id = 100
    или
  • @pessok,
    select top 1 color.id, color.name, color.catalog where color.catalog = 100
  • @myckolah, т.е. select top 1 выбирает верхнее значение?)
  • @myckolah, ругается на синтаксис...
  • @myckolah, собсна потому что ты для MSSQL написал, а надо для мускуля)
  • @myckolah, нагуглил вроде, LIMIT 1
  • @pessok, а, нет. это возвращает только одну строка всего запроса, мне надо по одной строке каждой строки... ну ты понел :)
  • @pessok, SELECT * FROM `catalog` cat JOIN on `color` col ON col.catalog = cat.id
  • @drakmail, И в конец — WHERE cat.id = '10' LIMIT 1
  • @drakmail, фишка в том, что LIMIT 1 выведет вообще только одну строку запроса, а мне нужно вывести по одной строке для каждого `catalog`.`id`, а их порядка 20к
  • @pessok, собсна запрос, на vendor можно не смотреть
    SELECT `catalog`.`id`, `catalog`.`title`, `catalog`.`category`, `catalog`.`weight`, `catalog`.`price`, `catalog`.`respect_price`,`vendor`.`koeff_y`, `vendor`.`title` as `vendtitle`, `color`.`title` as `coltitle`
    FROM `catalog`
    LEFT JOIN `vendor`
    ON `catalog`.`vendor` = `vendor`.`id`
    LEFT JOIN `color`
    ON `catalog`.`id` = `color`.`catalog`
    ORDER BY `catalog`.`id`
  • @pessok, тут дело в том, что всего 20к товаров, но, благодаря тупой системе таблиц, у каждого товара при изменении цвета в таблицу `color` записывается новый цвет, таким образом для товара может быть 100500 цветов, притом реальное значение только одно. Соответственно сколько итераций сделает запрос? Поганые 20к товаров он минут 10 обходит из-за цветов
  • @pessok, тебе нужно по одной записи для каждого каталога?
    добавь group by `catalog`.`id`
  • @pessok, а зачем тебе выбирать сразу 20к записей?
  • @sign, загрузка товаров с сайта в желтуху)
  • @sign, щас попробую, мерси
  • @sign, то, что хаус прописал, пасиба
  • @pessok, group by catalog.id
  • @pessok, велкам)
    минус групировки в том что ты не знаешь какую запись о цвете ты получишь, всмысле это будет одна из подходящих, но она не обязана быть первой или последней
  • @myckolah, угу, подсказали уже, но все равно мерси. кстати, походя, а как получить ПОСЛЕДНЮЮ строку, а не первую?)
  • @sign, хех, я так и подумал, скорее всего по алфавиту, но это лучше чем ничего
  • @pessok, ты получаешь не первую, а случайную, порядок выдачи записей, вообще говоря, не обязан быть отсортирован. Если нужна сортировка — order by
  • @pessok, нет, порядок не гарантирован, ты получаешь просто одну из подходящих записей
  • @myckolah, нет, не прокатит ; )
  • @sign, мгм, может тогда лучше в процессе обработки поудалять лишнее?.. неужели мускул сам не умеет такого? :)
  • @pessok, тебе точно надо получать конкретную запись цвета, а не любую подходящую?
  • @pessok, можно сделать через group_concat — там есть сортировка.
    что ты имеешь ввиду под "удалить лишнее"?
    удалить старые записи цветов перед выборкой?
  • @myckolah, последнюю надо... тупой вебмастер не стал делать таблицу с 30 цветами и давать таблице товаров поле с цветом. Он сделал так, что в цвета каждый раз при изменении цвета записывается новая строка...
  • @sign, сделать выборку, получить 100500 значений вместо 20000 и уже потом их канифолить... но как то не торт...
  • @pessok, то бишь обратную (что он курил?!) связь
  • @pessok, SELECT
    c.*,
    d.ranknum
    FROM
    color AS c
    INNER JOIN
    (
    SELECT
    a.id,
    COUNT(*) AS ranknum
    FROM
    color AS a
    INNER JOIN
    color AS b
    ON
    (a.catalog = b.catalog)
    AND
    (a.id <= b.id)
    GROUP BY
    a.id
    HAVING
    COUNT(*) <= 1
    ) AS d
    ON
    (c.id = d.id)
  • @pessok, под рукой только блокнот, так что проверять работоспособность предстоит тебе
  • @pessok, да, я пишу для T-SQL вообще, а не для конкретной реализации
  • @myckolah, щас попробуем :)
  • @myckolah, что-то завелось, вроде как. но вот я не уверен, что смогу под такую мегаструктуру вытащить свои поля. буду вкуриваца, мерси :)