PHP получить значение поля строки из цикла while - PullRequest
0 голосов
/ 12 апреля 2020

Предположим, у меня есть таблица, подобная этой:

Таблица swipes

swp_id    swp_by    swp_to    swp_type    swp_date
1           8          1       top        2020-03-24 02:39:12
2           11         1       right      2020-03-18 02:37:58
3           1          8       right      2020-03-31 04:04:40
4           1         11       top        2020-03-31 04:04:40

Исходя из того, что у меня есть мои настройки, как это:

<?php
  $stmt = $pdo->prepare("SELECT * FROM swipes WHERE swp_by = :mem AND swp_type != 'left' ORDER BY swp_id DESC");
  $stmt-> bindValue(':mem', $sessionUser);
  $stmt-> execute();

  while($swp = $stmt->fetch()){
      $match = $pdo->prepare("SELECT swp_id, swp_date FROM swipes WHERE swp_by = :by AND swp_to = :to AND swp_type != 'left'");
      $match-> bindValue(':by', $swp['swp_by']);
      $match-> bindValue(':to', $sessionUser);
      $match-> execute();

      while($mat = $match->fetch()){
?>
  <!-- Some HTML Part here to display fetched data as per second while loop -->
<?php } } ?>

Как Вы можете видеть прямо сейчас, у меня есть ORDER BY swp_id DESC в первом запросе, который работает нормально. Но когда я пытаюсь удалить из первого запроса и добавить его во второй запрос, это не работает. Что я на самом деле хочу сделать, так это получить время от последнего пролистывания.

Как вы можете видеть в приведенной выше таблице для первых двух строк с swp_id 1 & 2, пользователи 8 и 11 прокрутили пользователя 1 первый. Позже, пользователь 1 ударил пользователей 8 и 11, как вы можете видеть в записях с swp_id 3 и 4. Теперь записи 3 и 4 являются последними записями. Следовательно, я хочу получить swp_date из этих записей, а не из 1 и 2. Сейчас это дата возврата из записей 1 и 2.

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Предположим, что вы хотите получить все user_id и даты от пользователей, которые провели пальцем к user_id 1 , но только если он (она) проводил этого пользователя тоже, а не влево.

Так немного расширив вашу таблицу:

swp_by  swp_to  swp_type    swp_date
   8      1       top         ...
   8      4       top         ... <not
   11     1       top         ...
   1      8       top         ...
   1      11      top         ...
   20     1       top         ... < not
   1      40      top         ... < not
   1      41      left        ... < not

Первая часть: выберите из списка пользователя 1 swp_by = 1 все свайпы, которые не остались (аналогично вашему первому запросу):

// :mem = 1
SELECT swp_id, swp_by, swp_to, swp_date 
    FROM swipes
    WHERE swp_by = :mem AND swp_type <> "left"

Результат 1:

swp_by  swp_to  swp_type    swp_date
   1      8        top         ...
   1     11        top         ...
   1     40        top         ... <not

Вторая часть: найти все пролистывания «назад» на пользователя 1 , где swp_to = 1

// :mem = 1
SELECT swp_id, swp_by, swp_to, swp_date 
    FROM swipes
    WHERE swp_to = :mem AND swp_type <> "left"

Результат 2:

swp_by  swp_to  swp_type    swp_date
   8      1       top         ...
   11     1       top         ...
   20     1       top         ... < not

Теперь вы можете перекрестно ссылаться на результаты, находя swp_to числа из Результат 1 (8 , 11, 40), которые имеют swp_by в Результат 2 (8, 11, 20). Это можно сделать, используя LEFT JOIN из той же таблицы

//this, in combination with WHERE, gives Result 1
SELECT R1.swp_id, R1.swp_to, R1.swp_type , GREATEST(R1.swp_date,R2.swp_date)

    FROM swipes AS R1

//cross reference with Result 2
LEFT JOIN swipes AS R2
    ON ( 
    //look for those records where R1.swipe_to = R2.swipe_by
    R1.swp_to = R2.swp_by 
        AND
    //swipe_to from Result 2 has to be user 1
    R2.swp_to = R1.swp_by
        AND 
    //no left swipes in Result 2
    R2.swp_type <> "left" 
    )

WHERE 
    //look only at the records from user 1...
    R1.swp_by = :mem 
        AND
    //...that are not empty
    R2.swp_by IS NOT NULL
            AND
    //... that not are left
    R1.swp_type <> 'left' 
ORDER BY R1.swp_id DESC

Вот новая скрипка * РЕДАКТИРОВАТЬ ОП требуемая последняя дата, скорректированная с помощью GREATEST на дату

0 голосов
/ 12 апреля 2020

если вы начинаете с SessionUser = 8, первое l oop restore swp_by = 8, swp_id = 1. Тогда внутренний l oop запрашивает swp_by = 8 и swp_to = 8, то есть результатов нет. Вы видите только результаты первого l oop. Я полагаю, что вы должны рассмотреть свой второй запрос. Может быть:

$match-> bindValue(':by', $swp['swp_to']);
$match-> bindValue(':to', $swp['swp_by']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...