I have 2 tables, table1 has information about the producer (name of producer and their ID) of a resturant.
CREATE TABLE IF NOT EXISTS `fournisseur` (
`IdFournisseur` int(10) NOT NULL auto_increment,
`Fournisseur_Producteur` varchar(250) default NULL,
PRIMARY KEY (`IdFournisseur`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
table2 has dailymanue and the ID of thier producer(for exampe: IdMenuPlat, IdMenuEntree...).
CREATE TABLE IF NOT EXISTS `menu_jours` (
`menu_id` int(10) NOT NULL auto_increment,
`menu_j_titre` varchar(250), `menu_date_parution`,
`menu_entree` int(10),
`IdMenuEntree`,`menu_plat`,`IdMenuPlat`,`menu_acc1`,`IdMenuAcc1`,`menu_acc2`,`IdMenuAcc2`,`menu_sugg`,`IdMenuSugg`,`menu_sugg_acc`,`IdMenuSuggAcc`,`menu_dessert`,`IdMenuDessert` default NULL,
PRIMARY KEY (`menu_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
I want to recover daily menu with the name of their producer!
I used this query:
todaySQL = 'SELECT * FROM table2 AS t2
INNER JOIN table1 AS t1_1 ON (t1_1.IdProducter= t2.IdMenuPlat)
INNER JOIN table1 AS t1_2 ON (t1_2.IdProducter= t2.IdMenuEntree)
INNER JOIN table1 AS t1_3 ON (t1_3.IdProducter= t2.IdMenuAcc1)
INNER JOIN table1 AS t1_4 ON (t1_4.IdProducter= t2.IdMenuAcc2)
INNER JOIN table1 AS t1_5 ON (t1_5.IdProducter= t2.IdMenuSugg)
INNER JOIN table1 AS t1_6 ON (t1_6.IdProducter= t2.IdMenuSuggAcc)
INNER JOIN table1 AS t1_7 ON (t1_7.IdProducter= t2.IdMenuDessert)
WHERE menu_date_parution = \''.$todayDate.'\'' ;
but if I use this function:
todayRow = mysql_fetch_row( todaySQL )
I have all information in array by their index which is confusing for programming I would like to use this function:
todayRow = mysql_fetch_assoc( todaySQL )
which recover in array by the name of columns, but the problem is that I just have the infortmaion of the last producer ,not for the information of the all.
I think I should rename the column's name of producer(Fournisseur_Producteur) for each join. But how?
If i understand well, you dont use a loop to fetch the results.
You need a for or a while:
while($row=mysql_fetch_assoc($todaySQL)) {
echo $row['menu_id'];
}
Related
I have two tables in MySQL: t1 AND t2.
The structure is something like that:
t1.aa t2.az
t1.bb t2.zz
t1.cc t2.aa
t2.dz
Now, I need to get something like:
result: t1.aa = 'value', t2.dz = 'value';
BUT:
1) second table (t2) is possibly just empty
2) In my query "WHERE" statement like this:
WHERE t1.aa=t2.aa AND t2.zz=345
So, if second table is really empty I need get something like this:
result: t1.aa = 'value', t2.dz = null;
Thanks.
P.S. we have other answers like Select multiple tables when one table is empty in MySQL , but my problem is in "WHERE" statement..
My tables are:
Table t1
CREATE TABLE IF NOT EXISTS `t1` (
`aa` int(5) NOT NULL AUTO_INCREMENT,
`bb` varchar(56) NOT NULL,
`cc` varchar(56) NOT NULL,
PRIMARY KEY (`aa`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
Table t1 Data
INSERT INTO `t1` (`aa`, `bb`, `cc`) VALUES
(1, 'varchar in bb', 'cc varchar');
Table t2
CREATE TABLE IF NOT EXISTS `t2` (
`az` int(5) NOT NULL AUTO_INCREMENT,
`zz` int(5) NOT NULL,
`aa` int(5) NOT NULL,
`dz` int(10) NOT NULL,
PRIMARY KEY (`az`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Table t2 Data is null
I am not a genius, but I read mysql documentacion
http://dev.mysql.com/doc/#manual
Use JOIN ( I did not Test it) you need to prove it.
SELECT * FROM t1 LEFT JOIN t2 ON t1.aa == t2.aa WHERE t2.zz = 345
Lea Tano, we were close.
The right query is:
SELECT * FROM t1 LEFT JOIN t2 ON t1.aa=t2.aa AND zz=345
As you can see, there is no need in "WHERE" statement. This role has inherited by "ON ... AND ...".
Thank all for any help.
And Lea Tano, mostly.
In my database, I have 3 tables.
Jokes:
CREATE TABLE IF NOT EXISTS `jokes` (
`joke_id` int(11) NOT NULL AUTO_INCREMENT,
`joke` varchar(1024) NOT NULL,
`category_id` int(11) NOT NULL,
`vote` int(255) NOT NULL,
`date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`joke_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Category:
CREATE TABLE IF NOT EXISTS `category` (
`category_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(51) NOT NULL,
PRIMARY KEY (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
And finally, Comments:
CREATE TABLE IF NOT EXISTS `comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user` varchar(40) NOT NULL,
`comment` text NOT NULL,
`joke_id` int(11) NOT NULL,
`post_id` int(11) NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
These three tables need to be joined together to get data from each. So far i have used these three queries with no luck in getting what i need.
what i need this query to do is
Assign the joke_id to the joke_id in the comments, and also displays the joke_id in the view.
Assign the category_id of a joke to the name and display it
grab the votes
grab the jokes
1st query - this query does actually grab all the data i want, but at the same time does not grab the joke_id and pass it to view (as i need the joke_id to assign comments to that unique id):
SELECT j.*, c.name,
co.* FROM jokes j LEFT
JOIN category c ON c.category_id
= j.category_id LEFT JOIN
comments co ON co.joke_id =
j.joke_id WHERE j.joke_id = '$joke_id'
2nd query - This query joins the category to the correct one, and displays the joke and joke_id for me to assign comments to. But it does not show any comments
SELECT j.*, c.name
FROM jokes j LEFT JOIN category c
ON c.category_id = j.category_id
WHERE joke_id = '$joke_id'
3rd query - This query was provided by a user on stack overflow, but seems to throw a tonne of errors my way when a there is no comment attatched to that joke
SELECT c.*, j.*, co.*
FROM jokes j
INNER JOIN category c ON c.category_id = j.category_id
INNER JOIN comments co ON co.joke_id = j.joke_id
WHERE j.joke_id = '$joke_id'
Any help altering this query to get all the items in the three database together would be much appreciated!
Edit the selected fields to suits your needs. Also if you want to display only one joke and its data you have to set the id of the joke you want as you did on the WHERE for instance.
SELECT jokes.*, category.*, comments.* FROM jokes LEFT JOIN category ON jokes.category_id = category.category_id LEFT JOIN comments ON jokes.jokes_id = comments.joke_id
In my database, I have 3 tables.
Jokes:
CREATE TABLE IF NOT EXISTS `jokes` (
`joke_id` int(11) NOT NULL AUTO_INCREMENT,
`joke` varchar(1024) NOT NULL,
`category_id` int(11) NOT NULL,
`vote` int(255) NOT NULL,
`date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`joke_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Category:
CREATE TABLE IF NOT EXISTS `category` (
`category_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(51) NOT NULL,
PRIMARY KEY (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
And finally, Comments:
CREATE TABLE IF NOT EXISTS `comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(40) NOT NULL,
`comment` text NOT NULL,
`joke_id` int(11) NOT NULL,
`post_id` int(11) NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
I need to join all three tables together to get the category name of a joke, the joke itself, and the unique comments correlating to that specific joke_id.
For the moment I can only join two tables where the joke_id = 1. This will return the comments for that joke.
This function is stored in my read controller, with the name of Joke:
public function joke($joke_id = FALSE)
{
if ($joke_id === FALSE) redirect('main'); //go to default controller
$data['results'] = $this->comments_m->getComments($joke_id, $this->uri->segment(2));
$this->load->view('template/header');
$this->load->view('template/sidebar');
$this->load->view('content/read', $data);
$this->load->view('template/footer');
}
The model (getjokes_m) has a function called readJokes which grabs only the category, the joke, and the joke_id to read that one specific joke:
function readJokes($joke_id)
{
$query = $this->db->query("SELECT j.*, c.name FROM jokes j LEFT JOIN category c ON c.category_id = j.category_id WHERE joke_id = '$joke_id'") or die("No results found" );
//displays the results
return $query->result();
}
For the moment, this results in only getting the category name of a joke, and the joke itself. What i want is to grab the comments for this one joke as well. How can I alter my query to return the information that I need?
Edit:
This query seems to work:
SELECT c.name, j.*, co.* FROM jokes j LEFT JOIN category c ON c.category_id = j.category_id LEFT JOIN comments co ON co.joke_id = j.joke_id WHERE j.joke_id = '$joke_id'"
but at the same time, it grabs the joke as many times as the joke has been commented for some reason. I.e the joke has 6 comments, the joke is shown 6 times.
EDIT:
SELECT j.joke AS 'Joke', c.name AS 'Category', 'Comments : ' AS 'Comments'
FROM jokes j
LEFT JOIN category c ON c.category_id = j.category_id
WHERE j.joke_id = '1'
UNION
SELECT '' AS 'Joke', '' AS 'Category', c.comment AS 'Comments'
FROM comments c
WHERE c.joke_id = '1'
LIMIT 0 , 30
I don't have your data, it's hard to test, but you may want to try this one.
It's one query. A cleaner way would be to get the joke then for that joke id get the comments.
SELECT c.*, j.*, co.*
FROM jokes j
INNER JOIN category c ON c.category_id = j.category_id
INNER JOIN comments co ON co.joke_id = j.joke_id
WHERE j.joke_id = '1'
SQLFIDDLE DEMO
The query you show here is what you need
SELECT c.name, j.*, co.* FROM jokes j LEFT JOIN category c ON c.category_id = j.category_id LEFT JOIN comments co ON co.joke_id = j.joke_id WHERE j.joke_id = '$joke_id'"
or you can hit a separate query for comments by providing joke id. in fact using a separate query is good,as it reduce the fetch data volume if the number of comments is more.
I am trying to make a printable page, where there is all the sales of a specified manufacturer, listing all the products, between specified dates. If there has not been any sales, it should display 0.
The tables
// Manufacturer table
// mid, manufacturer
// Products table
// pid, product, ref_manufacturer_id
// Orders table
// oid, orderPrice, orderDateTime, ref_product_id
And the query that works (without date limitation)
SELECT prod.product, COALESCE(COUNT(pord.oid),0) AS orderCount,
COALESCE(SUM(pord.orderPrice),0) AS orderSum
FROM product_manufacturer AS manu
JOIN product_list AS prod ON prod.ref_manufacturer_id = manu.mid
LEFT JOIN product_orders AS pord ON pord.ref_product_id = prod.pid
WHERE manu.mid = :manu_id
GROUP BY prod.product;
But as soon as I add into the WHERE-syntax this
WHERE manu.mid = :manu_id AND DATE(pord.orderDateTime) BETWEEN :orders_start AND :orders_end
I am using PHP PDO on connecting and verifying that the manu_id is int and the orders_start/end is converted to MySQL date format.
But the question I am trying to fidn out is, what is causing the problem, that when I add the date restriction, every product that was not ordered, is not displayed on the output?
SQL on creating the tables
CREATE TABLE product_list (
pid bigint(20) unsigned NOT NULL AUTO_INCREMENT,
product varchar(255) NOT NULL,
ref_manufacturer_id bigint(20) unsigned NOT NULL,
PRIMARY KEY (pid),
KEY ref_manufacturer_id (ref_manufacturer_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
CREATE TABLE product_manufacturer (
mid bigint(20) unsigned NOT NULL AUTO_INCREMENT,
manufacturer varchar(255) NOT NULL,
PRIMARY KEY (mid),
UNIQUE KEY manufacturer (manufacturer)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
CREATE TABLE product_orders (
oid bigint(20) unsigned NOT NULL AUTO_INCREMENT,
orderPrice float(10,2) NOT NULL,
orderDatetime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
red_product_id bigint(20) unsigned NOT NULL,
PRIMARY KEY (oid),
KEY red_product_id (red_product_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
What you need is to move the orderDateTime criteria to the join clause instead of where clause like:
SELECT prod.product, COALESCE(COUNT(pord.oid),0) AS orderCount,
COALESCE(SUM(pord.orderPrice),0) AS orderSum
FROM product_manufacturer AS manu
JOIN product_list AS prod ON prod.ref_manufacturer_id = manu.mid
LEFT JOIN product_orders AS pord
ON pord.ref_product_id = prod.pid
AND DATE(pord.orderDateTime) BETWEEN :orders_start AND :orders_end
WHERE manu.mid = :manu_id
GROUP BY prod.product;
The reason it does not work within the WHERE clause is because of the NULL values returned from the outer join. When you do not have a row in product_orders fot a product, the outer join returns a NULL for the date field orderDateTime and that row will be filtered out because a NULL is not equal to anything.
Try:
SELECT p.product,
COALESCE(o.orderCount, 0) as orderCount,
COALESCE(o.orderSum,0) AS orderSum
FROM product_manufacturer AS m
JOIN product_list AS p ON p.ref_manufacturer_id = m.mid
LEFT JOIN (
SELECT ref_product_id as pid, COUNT(oid) AS orderCount, SUM(orderPrice) AS orderSum
FROM product_orders
WHERE DATE(orderDateTime) BETWEEN :orders_start AND :orders_end
GROUP BY ref_product_id
) AS o ON p.pid = o.pid
WHERE m.mid = :manu_id
Edit: Corrected after ypercube comment.
try this on the where clause.
WHERE manu.mid = :manu_id AND (DATE(pord.orderDateTime) BETWEEN :orders_start AND :orders_end)
It might be reading the second AND function as another where clause that the statement should return true. Just a hunch on that. Let me know if this does the trick.
I don't know how your specific system works, but it may be orderDateTime is not set (ie, NULL or something else) until that product gets ordered. You may want to try:
WHERE manu.mid = :manu_id AND ((DATE(pord.orderDateTime) BETWEEN :orders_start AND :orders_end) OR pord.orderDateTime=NULL)
If this is not the case, could you give an example of the orderDateTime value for something that is not showing up when you want it to?
I need to output A_Name, B_Name, and C_Name. from tableA, tableB, tableC. I have a linking table containing all the ID's of the above, e.g:
CREATE TABLE `tableLink` (
`tableLinkID` int(5) NOT NULL auto_increment,
`A_ID` int(11) NOT NULL,
`B_ID` int(5) NOT NULL,
`C_ID` int(5) NOT NULL,
PRIMARY KEY (`tableLinkID`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 AUTO_INCREMENT=17 ;
My question: I need to know how to SELECT based on having C_ID, how to select and output A_ID's [A_Name], B_ID's [B_Name], and C_ID's [C_Name].
I hope this is clear enough.
(I have the C_ID in a variable)
Try using JOINs:
SELECT
tableA.A_Name,
tableB.B_Name,
tableC.C_Name
FROM tableLink
JOIN tableA ON tableLink.A_ID = A.ID
JOIN tableB ON tableLink.B_ID = B.ID
JOIN tableC ON tableLink.C_ID = C.ID
WHERE tableLink.C_ID = 42