2013-12-06 4 views
1

, например:
мои продукты лучше строка сортировки «'8207,17631,16717,18545,9062,17469,17246,17750"Как я могу получить результат таблицы temp из строки?

эта строка размещена в PHP, я не хочу, чтобы хранить их в datebase , Я хочу запросить данные из mysql и слева присоединиться к таблице temp, а затем сортировать по таблице temp table.

Как я могу получить эту временную таблицу из строки?

enter image description here

моих кодов кажется будет как то ниже: (неправильные коды)

select 
    p.products_id 
from 
    (
     select '18207,17631,16717,18545,9062,17469,17246,17750' as products_id 
    ) as p 
order by p.sort 
+0

See IN() или FIND_IN_SET() – Strawberry

ответ

2

Ваш лучший подход может быть - использовать UNION для формирования строки набора из строки. Это, однако, потребует присоединения вашей строки в вашем приложении, например:

$string = '18207,17631,16717,18545,9062,17469,17246,17750'; 
$id  = 0; 
$sql = join(' UNION ALL '.PHP_EOL, array_map(function($item) use (&$id) 
{ 
    return 'SELECT '.(++$id).' AS sort, "'.$item.'" AS products_id'; 
}, explode(',', $string))); 

-end результат будет как:

SELECT 1 AS sort, "18207" AS products_id UNION ALL 
SELECT 2 AS sort, "17631" AS products_id UNION ALL 
SELECT 3 AS sort, "16717" AS products_id UNION ALL 
SELECT 4 AS sort, "18545" AS products_id UNION ALL 
SELECT 5 AS sort, "9062" AS products_id UNION ALL 
SELECT 6 AS sort, "17469" AS products_id UNION ALL 
SELECT 7 AS sort, "17246" AS products_id UNION ALL 
SELECT 8 AS sort, "17750" AS products_id 

Однако, если вы хотите сделать это в SQL - это будет не так просто, поскольку MySQL не поддерживает последовательности - и, следовательно, вам нужно будет использовать некоторые трюки для создания заданных наборов строк. Там есть способ создания N порядковые номера с:

SELECT id+1 
FROM 
    (SELECT 
    (two_1.id + two_2.id + two_4.id + 
    two_8.id + two_16.id) AS id 
    FROM 
    (SELECT 0 AS id UNION ALL SELECT 1 AS id) AS two_1 
    CROSS JOIN (SELECT 0 id UNION ALL SELECT 2 id) AS two_2 
    CROSS JOIN (SELECT 0 id UNION ALL SELECT 4 id) AS two_4 
    CROSS JOIN (SELECT 0 id UNION ALL SELECT 8 id) AS two_8 
    CROSS JOIN (SELECT 0 id UNION ALL SELECT 16 id) AS two_16 
    ) AS init 
LIMIT 10 

-за приведет к 10 чисел 1..10 (проверить this скрипку). Используя это, вы можете получить конечный результат:

SELECT 
    ELT(id+1, 18207,17631,16717,18545,9062,17469,17246,17750) AS products_id, 
    id+1 AS sort 
FROM 
    (SELECT 
    (two_1.id + two_2.id + two_4.id + 
    two_8.id + two_16.id) AS id 
    FROM 
    (SELECT 0 AS id UNION ALL SELECT 1 AS id) AS two_1 
    CROSS JOIN (SELECT 0 id UNION ALL SELECT 2 id) AS two_2 
    CROSS JOIN (SELECT 0 id UNION ALL SELECT 4 id) AS two_4 
    CROSS JOIN (SELECT 0 id UNION ALL SELECT 8 id) AS two_8 
    CROSS JOIN (SELECT 0 id UNION ALL SELECT 16 id) AS two_16 
    ) AS init 
HAVING 
    products_id IS NOT NULL 

-check this скрипку. Однако это может быть медленным, и я рекомендую вам использовать ваш прикладной уровень для создания желаемого SQL.

+0

большое спасибо! хороший ответ –

+0

+1 Отличное объяснение! –

+0

Мое единственное сомнение заключается в том, что обычно любая проблема такого рода является результатом применения Jaywalker SQL anti-pattern. –

1

что-то вроде этого? используйте UNION для создания встроенного представления. это может быть создано клиентской стороной.

SELECT * 
FROM 
(
    SELECT '18207' AS products_id, 1 as sort 
    UNION 
    SELECT '17631' AS products_id, 2 as sort 
    UNION 
    SELECT '16717' AS products_id, 3 as sort 
    UNION 
    SELECT '18545' AS products_id, 4 as sort 
    UNION 
    SELECT '9062' AS products_id, 5 as sort 
) x JOIN tbl x.products_id = tbl.products_id 
ORDER BY sort 
+0

Я хочу взорвать строку в таблице, как я могу получить «18207», когда вы используете «select» 18207 «» из моей строки? –

+0

@ mingfish_004 * как я могу получить '18207' * Я думаю, на это уже ответил @Alma, у меня есть вопрос. Есть ли причина, по которой вы не используете «ВРЕМЕНУ ТАБЛИЦУ»? MySQL Временная таблица видна только для каждого сеанса и автоматически отбрасывается при закрытии сеанса. –

+0

@ mingfish_004 Если строка имеет более + 10k products_id, то я думаю, что ИСПОЛЬЗОВАНИЕ ВРЕМЕННОГО ТАБЛИЦЫ было бы лучше. –

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