Как преобразовать подзапрос SQL в соединение

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

$this->db->select('b1.Invoice_No, cust_name, cust_address, cust_contact, Item_name, Item_qty, Item_amount');
$this->db->from(' tbl_bill_invoice as b1');
$this->db->join('tbl_billmenu as b2', 'b2.Invoice_No = b1.Invoice_No', 'inner');
$this->db->join('tbl_billcustomer as b3', 'b3.cust_id = b1.cust_id', 'inner');
$this->db->where('b1.Invoice_no', 13);
return $this->db->get()->row();
8
задан SkyWalker 31 May 2016 в 05:29
поделиться

6 ответов

Это, вероятно, не поможет, если таблица уже будет работать, но правильный способ смоделировать, это должно сделать версию = 0 постоянная версия и всегда увеличивать версию БОЛЕЕ СТАРОГО материала. Таким образом, при вставке новой версии, Вы сказали бы:

UPDATE thetable SET version = version + 1 WHERE id = :id
INSERT INTO thetable (id, version, title, ...) VALUES (:id, 0, :title, ...)

Затем этот запрос просто был бы

SELECT id, title, ... FROM thetable WHERE version = 0

Никакие подзапросы, никакое МАКС. агрегирование. Вы всегда знаете, какова текущая версия. Вы никогда не должны выбирать макс. (версия) для вставки новой записи.

13
ответ дан 5 December 2019 в 11:27
поделиться

Возможно, что-то вроде этого?

SELECT
  t2.id,
  t2.title,
  t2.contenttext,
  t2.fk_idothertable,
  t2.version
FROM mytable t1, mytable t2
WHERE t1.fk_idothertable == t2.fk_idothertable
GROUP BY t2.fk_idothertable, t2.version
HAVING t2.version=MAX(t1.version)

Просто произвольное предположение...

3
ответ дан 5 December 2019 в 11:27
поделиться

Вы Смогли делать МАКСА псевдонимом таблицы, который действительно группируется.

Это могло бы выглядеть примерно так:

SELECT 
   t1.id, 
   t1.title, 
   t1.contenttext,
   t1.fk_idothertable
   t1.version
FROM mytable as t1 JOIN
   (SELECT fk_idothertable, MAX(version) AS topversion
   FROM mytable
   GROUP BY fk_idothertable) as t2
ON t1.version = t2.topversion
0
ответ дан 5 December 2019 в 11:27
поделиться

Я думаю, что FerranB был близок, но не вполне имел группирующегося права:

with
latest_versions as (
   select 
      max(version) as latest_version,
      fk_idothertable
   from 
      mytable
   group by 
      fk_idothertable
)
select
  t1.id, 
  t1.title, 
  t1.contenttext,
  t1.fk_idothertable,
  t1.version
from 
   mytable as t1
   join latest_versions on (t1.version = latest_versions.latest_version 
      and t1.fk_idothertable = latest_versions.fk_idothertable);

M

0
ответ дан 5 December 2019 в 11:27
поделиться

Я не знаю, насколько эффективный это было бы, но:

SELECT t1.*, t2.version
FROM mytable AS t1
    JOIN (
        SElECT mytable.fk_idothertable, MAX(mytable.version) AS version
        FROM mytable
    ) t2 ON t1.fk_idothertable = t2.fk_idothertable
0
ответ дан 5 December 2019 в 11:27
поделиться

Как это... Я предполагаю, что 'mytable' в подзапросе была другая фактическая таблица..., таким образом, я назвал его mytable2. Если это была та же таблица затем, это будет все еще работать, но затем я предполагаю, что fk_idothertable просто будет 'идентификатором'.


SELECT 
   t1.id, 
   t1.title, 
   t1.contenttext,
   t1.fk_idothertable
   t1.version
FROM mytable as t1
    INNER JOIN (SELECT MAX(Version) AS topversion,fk_idothertable FROM mytable2 GROUP BY fk_idothertable) t2
        ON t1.id = t2.fk_idothertable AND t1.version = t2.topversion

Надеюсь, это поможет

-1
ответ дан 5 December 2019 в 11:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: