-- with CONCAT() you can compose strings with entries from database
-- IFNULL() is needed when the database strings within CONCAT() return NULL,
-- but for instance with  CONCAT(IFNULL(`characters`.`ant_ratio_mean` ,"?")) it's
-- possible to create a questionmark or whatever for having no data

SELECT
 `characters`.`id` AS 'characters_id',
  -- {citeID|20|Schmid 1993}
  CONCAT(
    '{citeID|',`names_authors`.`id`,'|',`names_authors`.`authors_short`,'} <!-- reference -->'
  ) AS 'reference',
  -- <img align='middle' width=200 title='Cricotopus albiforceps (mentum) Schmid 1993' src='../../species/CricCr_alfo_men_Sch1993_r.jpg' >
  CONCAT(`names_genera`.`name` ,
    IFNULL(CONCAT(" (",`names_subgenus`.`name`,") ") ," "),
    `names_species`.`name`,
    "<br><img align='middle' width=",
      `img_width_default` ,
      " title='",`names_genera`.`name` ," ",
      `names_species`.`name`,
      " (",`morph_attrib`.`morph_long`,") ",
      `names_authors`.`authors_short`,
      "' src='../../species/",`images`.`filename`,"' ><!-- species name --> ")  AS 'species',
  -- antennal ratio
  CONCAT(
    IFNULL(`characters`.`ant_ratio_mean` ,"?") ,
    IFNULL(
      CONCAT(' ( +- ',`characters`.`ant_ratio_variation`,
        IFNULL(
          CONCAT(', n=',`characters`.`ant_ratio_n`,')')
          ,')'
        )
      ) ,''
    ), '<!-- antennal ratio -->'
  ) AS 'antennal ratio',
  -- antennal blade ratio
  CONCAT(
    IFNULL(`characters`.`ant_blade_ratio_mean` ,"?") ,
    IFNULL(
      CONCAT(' ( +- ',`characters`.`ant_blade_ratio_variation`,
        IFNULL(
          CONCAT(', n=',`characters`.`ant_blade_ratio_n`,')'),
          ')'
        )
      ),''
    ), '<!-- antennal blade ratio -->'
  ) AS 'antennal blade ratio',
  -- head ratio
  CONCAT(
    IFNULL(`characters`.`head_ratio_mean` ,"?") ,
    IFNULL(
      CONCAT(' ( +- ',`characters`.`head_ratio_variation`,
        IFNULL(
          CONCAT(', n=',`characters`.`head_ratio_n`,')'),
          ')'
        )
      ),''
    ), '<!-- head ratio -->'
  ) AS 'head ratio',
  -- head color
  CONCAT(
    IFNULL(CONCAT('{',`head_color`,'}') ,"?"), '<!-- head color -->'
  ) AS 'head color',
  -- mentum middle TR
  CONCAT(
    IFNULL(`characters`.`men_middle_tooth_ratio_mean` ,"?") ,
    IFNULL(
      CONCAT(' ( +- ',`characters`.`men_middle_tooth_ratio_variation`,
        IFNULL(
          CONCAT(', n=',`characters`.`men_middle_tooth_ratio_n`,')'),
          ')'
        )
      ) , ''
    ), '<!-- mentum middle TR -->'
  ) AS 'mentum middle TR',
  -- mentum middle to 1.lat-TR
  CONCAT(
    IFNULL(`characters`.`men_middle-1stlat_tooth_ratio_mean` ,"?") ,
    IFNULL(
      CONCAT(' ( +- ',`characters`.`men_middle-1stlat_tooth_ratio_variance`,
        IFNULL(
          CONCAT(', n=',`characters`.`men_middle-1stlat_tooth_ratio_n`,')'),
          ')'
        )
      ),''
    ), '<!-- mentum middle to 1.lat-TR -->'
  ) AS 'mentum middle to 1.lat-TR',
  -- mentum s-submenti lat-tooth_position
  CONCAT(
    IFNULL(`characters`.`men_s-submenti_men-lat-tooth_position_mean` ,"?") ,
    IFNULL(
      CONCAT(' ( +- ',`characters`.`men_s-submenti_men-lat-tooth_position_variation`, ')') ,
      IFNULL(CONCAT(': ',`men_s-submenti_note` ),"")
    ), '<!-- mentum s-submenti lat-tooth_position -->'
  ) AS 'mentum s-submenti lat-tooth_position',
  -- mandible inner
  CONCAT(
    IFNULL(`man_inner`,"?") ,
    IFNULL(CONCAT(': ',`man_notes`),''), '<!-- mandible inner-->'
  )  AS 'mandible inner',
  -- mandible margin engraved?
  CONCAT(
    IFNULL(
      IF(`man_margin_engraved`<1,'no',
        IF(`man_margin_engraved`=1,'yes',`man_margin_engraved`)
      ),
      "?"
    ), '<!--mandible margin engraved?-->'
  ) AS 'mandible margin engraved?',
  -- mandible seta interna
  CONCAT(
    IFNULL(
      IF(`man_s-interna`<1,'no',
        IF(`man_s-interna`=1,'yes',`man_s-interna`)
      ) ,'?'
    ),
    IFNULL(CONCAT(': ',`man_s-interna_note`) ,""), '<!--mandible seta interna-->'
  ) AS 'mandible seta interna',
  -- mandible seta subdentalis
  CONCAT(
    IFNULL(IF(`man_s-subdentalis`<1,'no', IF(`man_s-subdentalis`=1,'yes',`man_s-subdentalis`)) ,'?'),
    IFNULL(CONCAT(': ',`man_s-subdentalis_note` ),"") , '<!--mandible seta subdentalis-->'
  ) AS 'mandible seta subdentalis',
  -- seta S1
  CONCAT(
    IFNULL( `lab_s1`,"?"),
    IFNULL(CONCAT(': ',`lab_s1_note`),""), '<!--seta S1-->'
  ) AS 'seta S1',
  -- premandible
  CONCAT(  
    IFNULL(`lab_n-preman_mean` ,"?"),
    IFNULL(CONCAT(", ",`lab_n-preman_min`, IFNULL(CONCAT('-',`lab_n-preman_max`),"")),""),
    IFNULL(CONCAT(', n=',`lab_n-preman_n`),""),
    IFNULL(CONCAT(': ',`lab_preman_notes`),""), '<!--premandible-->'
  ) AS 'premandible',
  -- premandible brush
  CONCAT(
    IFNULL(IF(`lab_preman_brush`<1,'no', IF(`lab_preman_brush`=1,'yes',`lab_preman_brush`)) ,"?"), '<!--premandible brush-->'
  )  AS 'premandible brush'
FROM
  `characters`,
  `images`,
  `names_authors`,
  `names_valid`,
  `names_subgenus`,
  `names_genera`,
  `names_species`,
  `morph_attrib`
WHERE (
  (`images`.`names_valid_id`       = `names_valid`.`id`) AND
  (`images`.`names_authors_id`     = `names_authors`.`id`) AND
  (`characters`.`names_valid_id`   = `names_valid`.`id`) AND
  (`characters`.`names_authors_id` = `names_authors`.`id`) AND
  (`names_subgenus`.`id`           = `names_valid`.`subgenus_name_id`) AND
  (`names_genera`.`id`             = `names_valid`.`genus_name_id`) AND
  (`names_species`.`id`            = `names_valid`.`species_name_id`) AND
  (`morph_attrib`.`id`             = `images`.`morph_id`) AND
  -- here a genus name has to be inserted vvv
  (`names_genera`.`name` LIKE '/*[VARIABLE]*/%') AND
  (`images`.`morph_id` =7)
)
ORDER BY `names_species`.`name` ASC