Выберите из 3 полей, row0 уникальный идентификатор, row1 несколько номеров идентификаторов, row2 буква int (1) в новый массив - PullRequest
1 голос
/ 26 марта 2012

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

Мне нужно выбрать одно из 3 полей таблицы.Первый - это log_id с уникальным номером для каждой строки, второй - это entry_id, который исходит из другой таблицы и содержит несколько одинаковых номеров записей, а последний - одну букву, представляющую тип.«D» означает, что соответствующая запись была удалена, кстати.

Пример:

"SELECT log_id, entry_id, type from entry_log order by entry_id";

... имеет следующий пример результата (фрагмент реального запроса):

6       1       C
31      1       D
8       2       C
25      2       D
11      3       C
14      3       D
13      3       D
18      4       D
17      4       D
12      4       C
22      5       D
15      5       C
398     6       U
249     6       U
44      6       U
587     6       R
272     6       U
498     6       R
578     6       U
590     6       U
529     6       R
564     6       D
43      7       U
42      7       D
16      7       C

Мне нужно выбрать самое высокое значение строки [0] для каждого значения строки [1], значение строки [2] которого равно 'D'.Другими словами, правильный выбор, когда строка [1] = 6, где строка [0] = 564 в массиве выше.Мне нужно поместить один entry_id (строка [1]) с соответствующим log_id (строка [0]) в другой массив.

Я пробовал следующее:

"SELECT MAX(log_id), entry_id, type from entry_log where type = 'D'";

Это делаетне учитывать тот факт, что некоторые строки 1 имеют записи выше, чем те, которые соответствуют D (поскольку они больше не удаляются).

Я пытался вернуться назад:

"SELECT log_id, entry_id, type from entry_log where log_id in ('U','R','C','x')";

Опять нетлогично.

$log = "SELECT log_id, entry_id, type from entry_log order by entry_id;
$lgcomp = mysql_query($log);
while ($row = mysql_fetch_array($logcomp, MYSQL_NUM)) {
    $cli = $row[0];
    $cei = $row[1];
    $ct = $row[2];
}
foreach ($cli as $key=>$clid)
    if $cei = 

... в тупик ...

foreach($cli as $key => $clid){
        $lgentry = $cei[$key];

    switch($clid) {
      case $lgentry =   :

        break;

... не могу понять ...

У меня просто нетТехническое понимание синтаксиса PHP MySQL для правильной реализации.

Будут оценены любые идеи или просто указание мне в правильном направлении.Нет, вам не нужно писать мой сценарий (мне нравится выяснять его, вот для чего все это для меня), но я тратил много времени на этот, и я знаю, что мне просто не хватает некоторого синтаксисаи понимание сортировки в PHP / mysql.Что касается поиска в Интернете, я придумываю только бесконечные повторы, которые не помогают в этом случае.

Спасибо!Этот 72-летний человек многому научился здесь за последние пару недель.

1 Ответ

1 голос
/ 26 марта 2012

Попробуйте это:

select el1.* from entry_log el1
left join (
  select entry_id, log_id from entry_log
  where type = 'D'
) el2
on el1.entry_id = el2.entry_id and el1.log_id < el2.log_id
where el2.log_id is null and el1.type = 'D'

Результат:

+--------+----------+------+
| LOG_ID | ENTRY_ID | TYPE |
+--------+----------+------+
|     31 |        1 | D    |
|     25 |        2 | D    |
|     14 |        3 | D    |
|     18 |        4 | D    |
|     22 |        5 | D    |
|    564 |        6 | D    |
|     42 |        7 | D    |
+--------+----------+------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...