Mysql-запрос, чтобы получить строки вокруг выбранной строки - PullRequest
2 голосов
/ 26 сентября 2011

Хорошо, я прочитал все подобные темы, но все еще не мог понять это сам.

Моя проблема: Я пытаюсь сделать таблицу относительных показателей для акций (цены, индексы). Мне нужно использовать эти 2 таблицы из моей базы данных здесь.

1-й стол:

Названия акций

Я запрашиваю эту таблицу, чтобы получить все названия акций в базе данных.

Например:

Array
(
    [0] => LT0000102337
    [1] => EE3100034653
    [2] => EE3100003609
    [3] => EE3800046643
    [4] => LT0000127375
    [5] => LV0000100659
    [6] => LV0000100501
)

2-й стол:

Значения индекса для моих акций (например, EV или EBITDA или P / E)

Все они хранятся для каждого запаса в отдельной таблице, начиная с i и номера запаса (т.е. iLT0000102337 или iEE3100034653).

Структура:

id | ev | ebitda | pe
23 | 12 | 141322 | 15

Допустим, у меня есть номер акции, и мне нужно получить последний идентификатор и его индекс (например, ev = 12).

Теперь мне нужно получить четыре строки из других таблиц фондовых индексов, чье ev ближе всего к 12 и 4 других, чье ev больше 12. Самое большое значение id означает самое новое значение, и мне нужны только те. То есть одна акция имеет самый большой идентификатор с 10, другая с 11, другая с 15 и т. Д., Поэтому мне нужно получить эти листы как 10, 10.1, 10.5, 11.5, 12 , 14, 15, 18, 22.

У меня довольно сложная структура таблиц, и я думаю, именно это делает ее сложной.

Для того, чтобы собрать все в одну таблицу, я использовал UNION, но теперь я застрял в рейтинге.

foreach($instrumentsm as $instrumentm) {
    $sqlxm .= "(SELECT id, ev, '$instrumentm' as name FROM i".$instrumentm." ORDER BY id DESC LIMIT 1)";
    if ($i<count($instrumentsm)-1){
        $sqlxm .= " UNION ";
        $i++;
    }
} 
$sqlxm .= " ORDER BY ev DESC";

Это создает мне запрос, подобный этому:

      (SELECT id, ev, 'LT0000102337' as name 
       FROM iLT0000102337 
       ORDER BY id DESC LIMIT 1) 
UNION (SELECT id, ev, 'EE3100034653' as name  
       FROM iEE3100034653  
       ORDER BY id DESC LIMIT 1) 
UNION (SELECT id, ev, 'EE3100003609' as name  
       FROM iEE3100003609  
       ORDER BY id DESC LIMIT 1) 
UNION (SELECT id, ev, 'EE3800046643' as name  
       FROM iEE3800046643  
       ORDER BY id DESC LIMIT 1) 
UNION (SELECT id, ev, 'LT0000127375' as name  
       FROM iLT0000127375  
       ORDER BY id DESC LIMIT 1) 
UNION (SELECT id, ev, 'LV0000100659' as name  
       FROM iLV0000100659  
       ORDER BY id DESC LIMIT 1) 
UNION (SELECT id, ev, 'LV0000100501' as name  
       FROM iLV0000100501  
       ORDER BY id DESC LIMIT 1) 
ORDER BY ev DESC

Теперь, я использую лучший алгоритм для этого и как сделать это сравнительное сравнение производительности? Спасибо!

1 Ответ

0 голосов
/ 05 октября 2011

Моя самая большая рекомендация - лучше нормализовать ваши данные.(Я не знаю в первую очередь об акциях, так что простите, если я что-то неправильно понял.)

Во-первых, не используйте один столбец в одной таблице для хранения внешнего ключа, который является составнымиз нескольких столбцов в другой таблице.Вместо этого имейте столбец идентификатора в каждой таблице.(Вы можете игнорировать столбец, пока он вам не понадобится, и рано или поздно вам это понадобится.)

Затем для каждой записи в «дочерней» таблице вы сохраняете идентификатор «родительского»как указано в таблице "parent's".

таблица 1 (наименования акций) может иметь следующие столбцы:

идентификатор, имя, специальная информация

таблица 2 (значения индекса)будет содержать столбец для хранения внешнего ключа, который связывает его с именем акции:

id, stock_name_id, stock_id, stock_ebitda, stock_ev, stock_pa

В поле stock_name_id вы вводите идентификаторчто соответствует имени, которому оно принадлежит.

Между прочим, все эти столбцы идентификаторов должны быть автоматически пронумерованы первичными ключами.

...