Note that there are some explanatory texts on larger screens.

plurals
  1. POComplex mySQL Query (again)
    primarykey
    data
    text
    <p>My apologies that the question title is not more specific.</p> <p>I am working on a system that involves stock control and membership records. The current problem relates to the 'membership packs' that are given to new members on joining; there are a variety of membership types and each one gets a pack with several items in, no two packs are exactly the same but there is some overlap with some products being used in more than one pack. I need to calculate the number of each product that is used in a given batch of new members.</p> <p>I can create a query that gives me the total of different membership types in a batch.</p> <p>I can create a query that give me the total of each product required to make one of each of those packs.</p> <p>I need to create a query that is a combination of both.</p> <p>The query that gives the total of each type in a batch: <code><pre> SELECT COUNT(*) AS theCount, membershipPackType FROM inputBatches LEFT JOIN inputActions ON inputActionID = inputBatchAction LEFT JOIN members ON memberID = inputBatchMemberID LEFT JOIN membershipPacks ON membershipPackType = memberMembershipType LEFT JOIN memPack ON memPackInputBatch = inputBatchID WHERE memPackBookedOut = 'U' AND inputActionAbbr &lt;> 'E' GROUP BY membershipPackType ORDER BY membershipPackType; </pre></code></p> <p>This query produces the output at the top of the linked image:</p> <p>The query that gives the total of each product to make one of each of the types from the result of the above query: <code><pre> SELECT COUNT(*) AS theCount, stockItem FROM membershipPackItems LEFT JOIN membershipPacks ON membershipPackNumber = membershipPackType LEFT JOIN stock ON stockNumber = membershipPackItemNo WHERE membershipPackNumber = 11 OR membershipPackNumber = 12 OR membershipPackNumber = 13 OR membershipPackNumber = 14 OR membershipPackNumber = 23 OR membershipPackNumber = 24 OR membershipPackNumber = 25 GROUP BY stockItem ORDER BY stockNumber; </pre></code></p> <p>This query produces the output at the bottom of this image:</p> <p><a href="http://www.kidderminsterharriers.com/images/query4.png" rel="nofollow noreferrer">http://www.kidderminsterharriers.com/images/query4.png</a></p> <p>If I could combine the two queries then I wouldn't have the WHERE clause in the second query that is hard-coded like that. Also, what this second query doesn't allow for is that the membershipPackItems table includes a field for quantity; it assumes that the quantity of each item per pack is 1.</p> <p>The ultimate aim is to have query that outputs in a similar fashion to the second query but that the column that is currently 'theCount' is a total allows for the number of each item in the pack (ie more than 1 if needed) and then multiplied up by the number of packs in the batch; in this case those items that currently have a count of 7 (there's 7 different types in this batch and those items appear in all of them) would be 62 (there's 62 members total in this batch).</p> <p>This is the structure of the data tables used: <code><pre> CREATE TABLE <code>membershipPackItems</code> ( <code>membershipPackItemID</code> int(10) NOT NULL auto_increment, <code>membershipPackNumber</code> int(7) NOT NULL, <code>membershipPackItemNo</code> varchar(6) NOT NULL, <code>membershipPackItemQty</code> int(7) NOT NULL, PRIMARY KEY (<code>membershipPackItemID</code>) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=71 ;</p> <p>CREATE TABLE <code>membershipPacks</code> ( <code>membershipPackID</code> int(5) NOT NULL auto_increment, <code>membershipPackTitle</code> varchar(50) default NULL, <code>membershipPackType</code> int(5) default NULL, PRIMARY KEY (<code>membershipPackID</code>) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;</p> <p>CREATE TABLE <code>stock</code> ( <code>stockID</code> int(10) NOT NULL auto_increment, <code>stockNumber</code> int(8) NOT NULL, <code>stockItem</code> varchar(50) NOT NULL, <code>stockNominalNo</code> int(14) NOT NULL, <code>stockVATNo</code> int(3) NOT NULL, <code>stockDecLevel</code> varchar(1) NOT NULL, <code>stockPeriodSold</code> int(14) NOT NULL, <code>stockPeriodSoldValue</code> float NOT NULL, <code>stockPPurchased</code> int(14) NOT NULL, <code>stockYTDSold</code> int(14) NOT NULL, <code>stockYTDSoldValue</code> float NOT NULL, <code>stockYTDPurchased</code> int(14) NOT NULL, <code>stockDefectLevel</code> int(14) NOT NULL, <code>stockCurrentLevel</code> int(14) NOT NULL, <code>stockReOrderLevel</code> int(14) NOT NULL, <code>stockHolding</code> int(14) NOT NULL, <code>stockBackOrderQty</code> int(14) NOT NULL, <code>stockRetail</code> float NOT NULL, <code>stockCost</code> float NOT NULL, <code>stockOrdered</code> int(14) NOT NULL, <code>stockSupplierNo</code> int(7) NOT NULL, <code>stockSupplierStockNo</code> varchar(20) NOT NULL, <code>stockDeliveryDate</code> date NOT NULL, <code>stockDeleted</code> varchar(1) NOT NULL, <code>stockAllowedLeaps</code> varchar(1) NOT NULL, <code>stockCount</code> int(14) NOT NULL, <code>stockCountDate</code> date NOT NULL, <code>stockCountComment</code> varchar(30) NOT NULL, <code>stockGroup1</code> varchar(4) NOT NULL, <code>stockGroup2</code> varchar(4) NOT NULL, <code>stockNewStockNo</code> varchar(6) NOT NULL, <code>stockStatus</code> int(3) NOT NULL, PRIMARY KEY (<code>stockID</code>) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1779 ;</p> <p>CREATE TABLE <code>inputBatches</code> ( <code>inputBatchID</code> int(10) NOT NULL auto_increment, <code>inputBatchInputNumber</code> int(8) NOT NULL, <code>inputBatchMemberID</code> int(8) NOT NULL, <code>inputBatchAction</code> int(5) NOT NULL, <code>inputBatchDate</code> date NOT NULL, PRIMARY KEY (<code>inputBatchID</code>) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=88 ;</p> <p>CREATE TABLE <code>members</code> ( <code>memberID</code> int(6) NOT NULL auto_increment, <code>memberCentre</code> int(5) NOT NULL, <code>memberMembershipNo</code> int(15) NOT NULL, <code>memberSurname</code> varchar(50) NOT NULL, <code>memberForename</code> varchar(50) NOT NULL, <code>memberSecondName</code> varchar(50) NOT NULL, <code>memberParentTitle</code> int(3) NOT NULL, <code>memberParentSurname</code> varchar(50) NOT NULL, <code>memberParentForename</code> varchar(50) NOT NULL, <code>memberStreet1</code> varchar(100) NOT NULL, <code>memberStreet2</code> varchar(100) NOT NULL, <code>memberTown</code> varchar(50) NOT NULL, <code>memberCounty</code> varchar(20) NOT NULL, <code>memberPostcode</code> varchar(10) NOT NULL, <code>memberPhoneSTD</code> varchar(6) NOT NULL, <code>memberPhone</code> varchar(20) NOT NULL, <code>memberMobile</code> varchar(20) NOT NULL, <code>memberEmail</code> varchar(255) NOT NULL, <code>memberDOB</code> date NOT NULL, <code>memberJoined</code> date NOT NULL, <code>memberGender</code> enum('m','f') NOT NULL, <code>memberSibling</code> enum('no','yes') NOT NULL default 'no', <code>memberMembershipType</code> int(3) NOT NULL, <code>memberSpecNeedsNo</code> int(5) NOT NULL, <code>memberPromoNo</code> int(5) NOT NULL, <code>memberDataProtect</code> enum('no','yes') NOT NULL default 'no', <code>memberReceived</code> date NOT NULL, <code>memberMemberType</code> int(4) NOT NULL, <code>memberSendPack</code> enum('no','yes') NOT NULL default 'no', <code>memberSendGift</code> enum('no','yes') NOT NULL default 'no', <code>memberExpire</code> date NOT NULL, <code>memberDespatched</code> date NOT NULL, <code>memberInputNo</code> int(10) NOT NULL, <code>memberSSC</code> int(10) NOT NULL, <code>memberPrevStreet1</code> varchar(100) NOT NULL, <code>memberPrevStreet2</code> varchar(100) NOT NULL, <code>memberPrevTown</code> varchar(50) NOT NULL, <code>memberPrevCounty</code> varchar(20) NOT NULL, <code>memberPrevPostcode</code> varchar(10) NOT NULL, <code>memberPrevCentre</code> varchar(5) NOT NULL, <code>memberInvoiced</code> float NOT NULL, <code>memberPaid</code> float NOT NULL, <code>memberSpecNeedsString</code> varchar(255) NOT NULL, <code>memberNotes</code> mediumtext, <code>memberMembershipYear</code> int(3) default '1', PRIMARY KEY (<code>memberID</code>), UNIQUE KEY <code>memberMembershipNo</code> (<code>memberMembershipNo</code>), KEY <code>memberFullName</code> (<code>memberSurname</code>,<code>memberForename</code>), KEY <code>memberSurname</code> (<code>memberSurname</code>), KEY <code>memberForename</code> (<code>memberForename</code>) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=631747 ;</p> <p>CREATE TABLE <code>memPack</code> ( <code>memPackID</code> int(10) NOT NULL auto_increment, <code>memPackBookedOut</code> varchar(1) NOT NULL, <code>memPackDate</code> date NOT NULL, <code>memPackMembershipNo</code> int(14) NOT NULL, <code>memPackLicenseeNo</code> int(7) NOT NULL, <code>memPackMemTypeNo</code> int(7) NOT NULL, <code>memPackInputNumber</code> int(13) NOT NULL, <code>memPackInputBatch</code> int(10) NOT NULL, <code>memPackCentreNo</code> int(14) NOT NULL, PRIMARY KEY (<code>memPackID</code>) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=13675 ; </pre></code></p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload