2013-02-13 4 views
2

Это то, что моя таблица выглядит сейчас:Выбрать записи, имеющие несколько значений, и перечислять их

Как вы можете видеть, есть несколько записей, как XRAY. То, что я хочу сделать, это перечислить те, чтобы быть как первый Xray второй Xray 3 Xray

или любого рода перечисления.

Это вопрос моей текущей таблицы, кстати

"SELECT 
      `incurredcharges`.`procedure_no`, 
    `c`.`procedure` 

FROM 
    incurredcharges 
    INNER JOIN (
    SELECT `procedure`, `procedure_no` FROM `charges` 
    UNION ALL 
    SELECT `confinement`, `procedure_no` FROM `confinement` 
    UNION ALL 
    SELECT `service`, `procedure_no` FROM `ultrasound` 
) c ON `incurredcharges`.`procedure_no` = c.`procedure_no` 
WHERE `incurredcharges`.`patient_no` = '$id'"; 

ответ

0

Пока я не знаю, как предварять «1», «второй» и т.д., вы можете предварять 1, 2, и т.д. Вот пример:

SELECT 
    CONCAT(CASE WHEN cnt > 1 THEN CONCAT(RN,'-') ELSE '' END, t.Proc) Proc 
FROM 
    (
    SELECT 
     @curRow:=CASE WHEN @prevRow = a.Proc THEN @curRow+1 ELSE 1 END AS rn, 
     a.Proc, 
     @prevRow:=Proc grp 
    FROM (
     SELECT Proc FROM Procedures ORDER BY Proc 
    ) a JOIN (SELECT @curRow:=0) r 
) t JOIN 
    (
    SELECT Proc, COUNT(Proc) cnt 
    FROM Procedures 
    GROUP BY Proc 
) c ON t.proc = c.proc 

И вот SQL Fiddle.

В принципе, вам необходимо сгруппировать свои процедуры вместе, указывая номер строки для каждой группы. Для тех записей, у которых более одного, добавьте номер строки.

--- EDIT ---

Учитывая ваш комментарий, ваш запрос просто должен быть помещен в основной FROM (ближе к середине), а затем вы должны принести procno до каждого оператора выбора. Вот что-то, что должно быть очень близко, хотя непроверено:

SELECT 
    procno, 
    CONCAT(CASE WHEN cnt > 1 THEN CONCAT(RN,'-') ELSE '' END, t.Proc) Proc 
FROM 
    (
    SELECT 
     @curRow:=CASE WHEN @prevRow = a.Proc THEN @curRow+1 ELSE 1 END AS rn, 
     a.Proc, 
     a.Procno, 
     @prevRow:=Proc grp 
    FROM ( 
      SELECT 
      `incurredcharges`.`procedure_no` procno, 
      `c`.`procedure` proc 
      FROM 
      incurredcharges 
      INNER JOIN (
       SELECT `procedure`, `procedure_no` FROM `charges` 
       UNION ALL 
       SELECT `confinement`, `procedure_no` FROM `confinement` 
       UNION ALL 
       SELECT `service`, `procedure_no` FROM `ultrasound` 
      ) c ON `incurredcharges`.`procedure_no` = c.`procedure_no` 
      WHERE `incurredcharges`.`patient_no` = '$id' 
      ORDER BY `c`.`procedure` 
    ) a 
      JOIN (SELECT @curRow:=0) r 
) t JOIN 
    (
      SELECT 
      `incurredcharges`.`procedure_no` procno, 
      `c`.`procedure` proc, Count(*) cnt 
      FROM 
      incurredcharges 
      INNER JOIN (
       SELECT `procedure`, `procedure_no` FROM `charges` 
       UNION ALL 
       SELECT `confinement`, `procedure_no` FROM `confinement` 
       UNION ALL 
       SELECT `service`, `procedure_no` FROM `ultrasound` 
      ) c ON `incurredcharges`.`procedure_no` = c.`procedure_no` 
      WHERE `incurredcharges`.`patient_no` = '$id' 
      GROUP BY `incurredcharges`.`procedure_no`, 
      `c`.`procedure` 
) c ON t.proc = c.proc 

Удачи.

+0

Это замечательно. Но у меня возникли проблемы с его включением с помощью моего запроса sql. – jeffmangum

+0

@jeffmangum - Рад слышать, что это может работать, но извините за неприятность. Я отредактировал свой ответ - см. Выше. Дайте мне знать, как это работает для вас. Если бы вы могли построить скрипку, я бы ее протестировал, но это должно быть довольно близко. Удачи (и не забудьте принять ответ, если это вам помогло) :) – sgeddes

+0

@jeffmangum - вам также нужно будет обновить последний запрос, который используется для получения счета - я снова отредактирую сейчас ... – sgeddes

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