2015-06-01 5 views
-1

У меня есть таблица «продукты»Выбрать соответствующие данные из той же таблицы?

id | title | color_id (fk) | type_id (fk) | price_range_id (fk) 

Я выполнить запрос на выборку:

SELECT * FROM products where id = 1 

Мне нужно, чтобы получить продукты, связанные с одной и той же таблицы. Как мне это сделать? Поэтому мне нужно выбрать строку с идентификатором 1, а затем выбрать 10 других продуктов, которые имеют одинаковые colour_id, type_id и price_range_id.

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

Я не ожидаю, что кто-то здесь сделает всю работу, просто кто-нибудь может указать мне в правильном направлении, с чего начать эту проблему?

+1

'self join' на различных полях, которые быстро станут уродливыми. –

+0

Вы забыли рассказать нам: какую базу данных вы используете. Если хранимые процедуры являются опцией. Какой метод вы используете для доступа к базе данных? Клиент, JDBC, Perl, Python, PHP ????? Можете ли вы выполнить SQL в нескольких раундах или связаны с одной большой операцией SQL? Если вы используете язык программирования, это не имеет большого значения. Если это должно быть одно утверждение, я не вижу простого решения. –

+0

Использование PHP и MYSQL и любого решения, не связанного с одним утверждением – panthro

ответ

0

Привет, если я правильно понимаю ваш вопрос, вы должны создать хранимую процедуру так:

CREATE PROCEDURE sp_select(IN inId INT) 
BEGIN 
    SET @numSelected := (SELECT COUNT(*) FROM t1 
    WHERE color_id = (SELECT color_id FROM t1 WHERE id = inId) 
    AND type_id = (SELECT type_id FROM t1 WHERE id = inId) 
    AND price_range_id = (SELECT price_range_id FROM t1 WHERE id = inId) 
    AND id != inId 
    LIMIT 10); 

    SET @numRemaind := (10 - @numSelected); 

    PREPARE statement FROM 'SELECT * FROM t1 WHERE id = ? 
    UNION ALL 
    SELECT * FROM (SELECT * FROM t1 
    WHERE color_id = (SELECT color_id FROM t1 WHERE id = ?) 
    AND type_id = (SELECT type_id FROM t1 WHERE id = ?) 
    AND price_range_id = (SELECT price_range_id FROM t1 WHERE id = ?) 
    AND id != ? 
    LIMIT 10) t 
    UNION ALL 
    SELECT * FROM (SELECT * FROM t1 
    WHERE id != ? AND 
    id NOT IN (SELECT id FROM t1 
      WHERE color_id = (SELECT color_id FROM t1 WHERE id = ?) 
      AND type_id = (SELECT type_id FROM t1 WHERE id = ?) 
      AND price_range_id = (SELECT price_range_id FROM t1 WHERE id = ?) 
      AND id != ?) 
    ORDER BY RAND() 
    LIMIT ?) tx'; 

    SET @p1 = inId; 
    SET @p2 = @numRemaind; 

    EXECUTE statement USING @p1, @p1, @p1, @p1, @p1, @p1, @p1, @p1, @p1, @p1, @p2; 

END// 

Вот является SQL Fiddle для того, чтобы увидеть, как это работа. В первой строке таблицы будут выделены строки с одинаковыми идентификаторами color_id, type_id и price_range, и если не будет добавлено 10 строк, они добавят случайные строки, которые не были выбраны на предыдущих этапах ...

GL!

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